]> git.argeo.org Git - lgpl/argeo-commons.git/blob - JcrAuthenticationProvider.java
bfa51f5b12d11049d1aa7d33e6174e076fb7b6a8
[lgpl/argeo-commons.git] / JcrAuthenticationProvider.java
1 package org.argeo.security.jcr;
2
3 import java.util.HashMap;
4 import java.util.Map;
5
6 import javax.jcr.Node;
7 import javax.jcr.Repository;
8 import javax.jcr.RepositoryException;
9 import javax.jcr.RepositoryFactory;
10 import javax.jcr.Session;
11 import javax.jcr.SimpleCredentials;
12
13 import org.argeo.ArgeoException;
14 import org.argeo.jcr.ArgeoJcrConstants;
15 import org.argeo.jcr.ArgeoNames;
16 import org.argeo.jcr.ArgeoTypes;
17 import org.argeo.security.SiteAuthenticationToken;
18 import org.springframework.security.Authentication;
19 import org.springframework.security.AuthenticationException;
20 import org.springframework.security.GrantedAuthority;
21 import org.springframework.security.GrantedAuthorityImpl;
22 import org.springframework.security.providers.AuthenticationProvider;
23
24 /** Connects to a JCR repository and delegate authentication to it. */
25 public class JcrAuthenticationProvider implements AuthenticationProvider {
26 private RepositoryFactory repositoryFactory;
27 private final String defaultHome;
28 private final String userRole;
29
30 public JcrAuthenticationProvider() {
31 this("ROLE_USER", "home");
32 }
33
34 public JcrAuthenticationProvider(String userRole) {
35 this(userRole, "home");
36 }
37
38 public JcrAuthenticationProvider(String defaultHome, String userRole) {
39 super();
40 this.defaultHome = defaultHome;
41 this.userRole = userRole;
42 }
43
44 public Authentication authenticate(Authentication authentication)
45 throws AuthenticationException {
46 if (!(authentication instanceof SiteAuthenticationToken))
47 return null;
48 SiteAuthenticationToken siteAuth = (SiteAuthenticationToken) authentication;
49 String url = siteAuth.getUrl();
50 if (url == null)
51 return null;
52
53 try {
54 Map<String, String> parameters = new HashMap<String, String>();
55 parameters.put(ArgeoJcrConstants.JCR_REPOSITORY_URI, url);
56
57 Repository repository = null;
58 repository = repositoryFactory.getRepository(parameters);
59 if (repository == null)
60 return null;
61
62 SimpleCredentials sp = new SimpleCredentials(siteAuth.getName(),
63 siteAuth.getCredentials().toString().toCharArray());
64 String workspace = siteAuth.getWorkspace();
65 Session session;
66 if (workspace == null || workspace.trim().equals(""))
67 session = repository.login(sp);
68 else
69 session = repository.login(sp, workspace);
70 Node userHome = getUserHome(session);
71 GrantedAuthority[] authorities = {};
72 return new JcrAuthenticationToken(siteAuth.getPrincipal(),
73 siteAuth.getCredentials(), authorities, url, userHome);
74 } catch (RepositoryException e) {
75 throw new ArgeoException(
76 "Unexpected exception when authenticating to " + url, e);
77 }
78 }
79
80 protected GrantedAuthority[] getGrantedAuthorities(Session session) {
81 return new GrantedAuthority[] { new GrantedAuthorityImpl(userRole) };
82 }
83
84 @SuppressWarnings("rawtypes")
85 public boolean supports(Class authentication) {
86 return SiteAuthenticationToken.class.isAssignableFrom(authentication);
87 }
88
89 protected Node getUserHome(Session session) {
90 String userID = "<not yet logged in>";
91 try {
92 userID = session.getUserID();
93 Node rootNode = session.getRootNode();
94 Node homeNode;
95 if (!rootNode.hasNode(defaultHome)) {
96 homeNode = rootNode.addNode(defaultHome, ArgeoTypes.ARGEO_HOME);
97 } else {
98 homeNode = rootNode.getNode(defaultHome);
99 }
100
101 Node userHome;
102 if (!homeNode.hasNode(userID)) {
103 userHome = homeNode.addNode(userID);
104 userHome.addMixin(ArgeoTypes.ARGEO_USER_HOME);
105 userHome.setProperty(ArgeoNames.ARGEO_USER_ID, userID);
106 } else {
107 userHome = homeNode.getNode(userID);
108 }
109 session.save();
110 return userHome;
111 } catch (Exception e) {
112 throw new ArgeoException("Cannot initialize home for user '"
113 + userID + "'", e);
114 }
115 }
116
117 public void register(RepositoryFactory repositoryFactory,
118 Map<String, String> parameters) {
119 this.repositoryFactory = repositoryFactory;
120 }
121
122 public void unregister(RepositoryFactory repositoryFactory,
123 Map<String, String> parameters) {
124 this.repositoryFactory = null;
125 }
126
127 public String getDefaultHome() {
128 return defaultHome;
129 }
130
131 public String getUserRole() {
132 return userRole;
133 }
134
135 }