1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 package org.talika.jsm;
24
25 import java.security.*;
26 import javax.naming.*;
27 import javax.naming.directory.*;
28 import java.util.Set;
29 import java.util.Hashtable;
30
31 import org.jboss.security.RealmMapping;
32 import org.jboss.security.EJBSecurityManager;
33
34 /***
35 *
36 * @author Jose M. Palomar <josem@talika.org>
37 * @version $Revision: 20 $
38 */
39 public class LDAPSecurityModule implements RealmMapping, EJBSecurityManager
40 {
41
42 /*** Creates new LDAPSecurityModule */
43 public LDAPSecurityModule(DirContext ctx, String searchBase) {
44
45 _ctx = ctx;
46 _searchBase = searchBase;
47
48 }
49
50 public Principal getPrincipal(Principal principal) {
51 return principal;
52 }
53
54 public boolean doesUserHaveRole(Principal principal, Set roles) {
55
56 boolean hasRole = false;
57
58 if(principal != null && roles != null) {
59
60 try {
61
62 SearchResult sr = searchPrincipal(principal);
63 if(sr != null) {
64
65 Attributes attrs = sr.getAttributes();
66 if(attrs != null) {
67
68 Attribute roleAttr = attrs.get(ROLE_ATTR);
69 if(roleAttr != null) {
70
71 NamingEnumeration roleValues = roleAttr.getAll();
72 while(roleValues.hasMore() && !hasRole) {
73
74 String role = (String) roleValues.next();
75 if (roles.contains(role))
76 hasRole = true;
77
78 }
79 }
80 }
81
82 }
83
84 }
85 catch(NamingException ne) {
86 ne.printStackTrace();
87 }
88
89 }
90
91 return hasRole;
92
93 }
94
95 public boolean isValid(Principal principal, Object credential) {
96
97 boolean valid = false;
98
99 if(principal != null && credential != null) {
100
101 try {
102
103 SearchResult sr = searchPrincipal(principal);
104 if(sr != null) {
105
106
107 String principalDN = sr.getName();
108 if(sr.isRelative())
109 principalDN += "," + _searchBase;
110
111
112 Hashtable env = _ctx.getEnvironment();
113
114 env.put(Context.SECURITY_PRINCIPAL, principalDN);
115 env.put(Context.SECURITY_CREDENTIALS, credential);
116
117 try {
118 DirContext ctx = new InitialDirContext(env);
119 valid = true;
120 }
121 catch(NamingException ne) { }
122
123 }
124
125 }
126 catch(NamingException ne) {
127 ne.printStackTrace();
128 }
129
130 }
131
132 return valid;
133
134 }
135
136 private SearchResult searchPrincipal(Principal principal) throws NamingException {
137
138
139 SearchControls searchCtrl = new SearchControls();
140 searchCtrl.setSearchScope(SearchControls.SUBTREE_SCOPE);
141 searchCtrl.setReturningAttributes(ATTRIBUTES);
142
143
144 NamingEnumeration results = _ctx.search(_searchBase, "(&(objectclass="+OBJECTCLASS+")(uid="+principal.getName()+"))",searchCtrl);
145 if(results != null && results.hasMore()) {
146 return (SearchResult) results.next();
147 }
148 else
149 return null;
150
151 }
152
153 private DirContext _ctx = null;
154 private String _url = null;
155 private String _user = null;
156 private String _password = null;
157 private String _searchBase = null;
158
159 public final static String USER_ATTR = "uid";
160 public final static String ROLE_ATTR = "role";
161 public final static String[] ATTRIBUTES = {USER_ATTR, ROLE_ATTR};
162
163 public final static String OBJECTCLASS = "j2eeAccount";
164
165 }