X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=security%2Fruntime%2Forg.argeo.security.core%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fsecurity%2Fjcr%2FOsJcrAuthenticationProvider.java;fp=security%2Fruntime%2Forg.argeo.security.core%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fsecurity%2Fjcr%2FOsJcrAuthenticationProvider.java;h=192d2fdb2f801ee51a0beed4a77079c3d270edf4;hb=149023e5969377045847bbecf24b0898b18a67a9;hp=0000000000000000000000000000000000000000;hpb=832bee8656e427eef8580b6d24bfdcf4526fce95;p=lgpl%2Fargeo-commons.git diff --git a/security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/jcr/OsJcrAuthenticationProvider.java b/security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/jcr/OsJcrAuthenticationProvider.java new file mode 100644 index 000000000..192d2fdb2 --- /dev/null +++ b/security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/jcr/OsJcrAuthenticationProvider.java @@ -0,0 +1,96 @@ +package org.argeo.security.jcr; + +import java.util.Map; +import java.util.concurrent.Executor; + +import javax.jcr.Node; +import javax.jcr.RepositoryException; +import javax.jcr.RepositoryFactory; +import javax.jcr.Session; + +import org.argeo.ArgeoException; +import org.argeo.jcr.JcrUtils; +import org.argeo.security.OsAuthenticationToken; +import org.argeo.security.core.OsAuthenticationProvider; +import org.springframework.security.Authentication; +import org.springframework.security.AuthenticationException; +import org.springframework.security.userdetails.UserDetails; + +public class OsJcrAuthenticationProvider extends OsAuthenticationProvider { + private RepositoryFactory repositoryFactory; + private Executor systemExecutor; + private String homeBasePath = "/home"; + private String repositoryAlias = "node"; + private String workspace = null; + + public Authentication authenticate(Authentication authentication) + throws AuthenticationException { + final OsAuthenticationToken authen = (OsAuthenticationToken) super + .authenticate(authentication); + systemExecutor.execute(new Runnable() { + public void run() { + try { + Session session = JcrUtils.getRepositoryByAlias( + repositoryFactory, repositoryAlias) + .login(workspace); + Node userHome = JcrUtils.getUserHome(session, + authen.getName()); + if (userHome == null) + JcrUtils.createUserHome(session, homeBasePath, + authen.getName()); + authen.setDetails(getUserDetails(userHome, authen)); + } catch (RepositoryException e) { + throw new ArgeoException( + "Unexpected exception when synchronizing OS and JCR security ", + e); + } + } + }); + return authen; + } + + /** Builds user details based on the authentication and the user home. */ + protected UserDetails getUserDetails(Node userHome, Authentication authen) { + try { + // TODO: loads enabled, locked, etc. from the home node. + return new JcrUserDetails(userHome.getPath(), authen.getPrincipal() + .toString(), authen.getCredentials().toString(), + isEnabled(userHome), true, true, true, + authen.getAuthorities()); + } catch (Exception e) { + throw new ArgeoException("Cannot get user details for " + userHome, + e); + } + } + + protected Boolean isEnabled(Node userHome) { + return true; + } + + public void register(RepositoryFactory repositoryFactory, + Map parameters) { + this.repositoryFactory = repositoryFactory; + } + + public void unregister(RepositoryFactory repositoryFactory, + Map parameters) { + this.repositoryFactory = null; + } + + public void setSystemExecutor(Executor systemExecutor) { + this.systemExecutor = systemExecutor; + } + + public void setHomeBasePath(String homeBasePath) { + this.homeBasePath = homeBasePath; + } + + public void setRepositoryAlias(String repositoryAlias) { + this.repositoryAlias = repositoryAlias; + } + + public void setWorkspace(String workspace) { + this.workspace = workspace; + } + +}