1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.acegisecurity.ldap.search;
17
18 import org.acegisecurity.ldap.InitialDirContextFactory;
19 import org.acegisecurity.ldap.LdapTemplate;
20 import org.acegisecurity.ldap.LdapUserSearch;
21
22 import org.acegisecurity.userdetails.UsernameNotFoundException;
23 import org.acegisecurity.userdetails.ldap.LdapUserDetails;
24 import org.acegisecurity.userdetails.ldap.LdapUserDetailsImpl;
25 import org.acegisecurity.userdetails.ldap.LdapUserDetailsMapper;
26
27 import org.apache.commons.logging.Log;
28 import org.apache.commons.logging.LogFactory;
29
30 import org.springframework.dao.IncorrectResultSizeDataAccessException;
31
32 import org.springframework.util.Assert;
33
34 import javax.naming.directory.DirContext;
35 import javax.naming.directory.SearchControls;
36
37
38
39
40
41
42
43
44
45
46
47 public class FilterBasedLdapUserSearch implements LdapUserSearch {
48
49
50 private static final Log logger = LogFactory.getLog(FilterBasedLdapUserSearch.class);
51
52
53
54 private InitialDirContextFactory initialDirContextFactory;
55 private LdapUserDetailsMapper userDetailsMapper = new LdapUserDetailsMapper();
56
57
58
59
60
61 private SearchControls searchControls = new SearchControls();
62
63
64 private String searchBase = "";
65
66
67
68
69
70
71
72
73
74
75
76
77 private String searchFilter;
78
79
80
81 public FilterBasedLdapUserSearch(String searchBase, String searchFilter,
82 InitialDirContextFactory initialDirContextFactory) {
83 Assert.notNull(initialDirContextFactory, "initialDirContextFactory must not be null");
84 Assert.notNull(searchFilter, "searchFilter must not be null.");
85 Assert.notNull(searchBase, "searchBase must not be null (an empty string is acceptable).");
86
87 this.searchFilter = searchFilter;
88 this.initialDirContextFactory = initialDirContextFactory;
89 this.searchBase = searchBase;
90
91 if (searchBase.length() == 0) {
92 logger.info("SearchBase not set. Searches will be performed from the root: "
93 + initialDirContextFactory.getRootDn());
94 }
95 }
96
97
98
99
100
101
102
103
104
105
106
107
108 public LdapUserDetails searchForUser(String username) {
109 if (logger.isDebugEnabled()) {
110 logger.debug("Searching for user '" + username + "', with user search "
111 + this.toString());
112 }
113
114 LdapTemplate template = new LdapTemplate(initialDirContextFactory);
115
116 template.setSearchControls(searchControls);
117
118 try {
119 LdapUserDetailsImpl.Essence user = (LdapUserDetailsImpl.Essence) template.searchForSingleEntry(searchBase,
120 searchFilter, new String[] {username}, userDetailsMapper);
121 user.setUsername(username);
122
123 return user.createUserDetails();
124 } catch (IncorrectResultSizeDataAccessException notFound) {
125 if (notFound.getActualSize() == 0) {
126 throw new UsernameNotFoundException("User " + username + " not found in directory.");
127 }
128
129 throw notFound;
130 }
131 }
132
133
134
135
136
137
138 public void setDerefLinkFlag(boolean deref) {
139 searchControls.setDerefLinkFlag(deref);
140 }
141
142
143
144
145
146
147
148
149 public void setSearchSubtree(boolean searchSubtree) {
150 searchControls.setSearchScope(searchSubtree ? SearchControls.SUBTREE_SCOPE : SearchControls.ONELEVEL_SCOPE);
151 }
152
153
154
155
156
157
158 public void setSearchTimeLimit(int searchTimeLimit) {
159 searchControls.setTimeLimit(searchTimeLimit);
160 }
161
162 protected LdapUserDetailsMapper getUserDetailsMapper() {
163 return userDetailsMapper;
164 }
165
166 public void setUserDetailsMapper(LdapUserDetailsMapper userDetailsMapper) {
167 this.userDetailsMapper = userDetailsMapper;
168 }
169
170 public String toString() {
171 StringBuffer sb = new StringBuffer();
172
173 sb.append("[ searchFilter: '").append(searchFilter).append("', ");
174 sb.append("searchBase: '").append(searchBase).append("'");
175 sb.append(", scope: ")
176 .append(searchControls.getSearchScope() == SearchControls.SUBTREE_SCOPE ? "subtree" : "single-level, ");
177 sb.append("searchTimeLimit: ").append(searchControls.getTimeLimit());
178 sb.append("derefLinkFlag: ").append(searchControls.getDerefLinkFlag()).append(" ]");
179
180 return sb.toString();
181 }
182 }