Skip to content

Commit 6b436ff

Browse files
fhanikRob Winch
authored andcommitted
Avoid duplicate attribute search.
When using search-and-bind strategy, the user attributes are already returned in the first search. If the user happens to not have privileges to perform a search, the second search may fail. (user only has bind privileges) See cloudfoundry/uaa#342
1 parent ca76e8d commit 6b436ff

File tree

2 files changed

+17
-7
lines changed

2 files changed

+17
-7
lines changed

ldap/src/integration-test/java/org/springframework/security/ldap/authentication/BindAuthenticatorTests.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import static org.assertj.core.api.Assertions.assertThat;
3131
import static org.assertj.core.api.Assertions.fail;
3232

33+
3334
/**
3435
* Tests for {@link BindAuthenticator}.
3536
*
@@ -90,7 +91,9 @@ public void testAuthenticationWithUserSearch() throws Exception {
9091
this.authenticator.setUserSearch(new FilterBasedLdapUserSearch("ou=people",
9192
"(uid={0})", getContextSource()));
9293
this.authenticator.afterPropertiesSet();
93-
this.authenticator.authenticate(this.bob);
94+
DirContextOperations result = this.authenticator.authenticate(this.bob);
95+
//ensure we are getting the same attributes back
96+
assertThat(result.getStringAttribute("cn")).isEqualTo("Bob Hamilton");
9497
// SEC-1444
9598
this.authenticator.setUserSearch(new FilterBasedLdapUserSearch("ou=people",
9699
"(cn={0})", getContextSource()));

ldap/src/main/java/org/springframework/security/ldap/authentication/BindAuthenticator.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,6 @@
1616

1717
package org.springframework.security.ldap.authentication;
1818

19-
import javax.naming.directory.Attributes;
20-
import javax.naming.directory.DirContext;
21-
2219
import org.apache.commons.logging.Log;
2320
import org.apache.commons.logging.LogFactory;
2421
import org.springframework.ldap.NamingException;
@@ -35,6 +32,9 @@
3532
import org.springframework.util.Assert;
3633
import org.springframework.util.StringUtils;
3734

35+
import javax.naming.directory.Attributes;
36+
import javax.naming.directory.DirContext;
37+
3838
/**
3939
* An authenticator which binds as a user.
4040
*
@@ -93,7 +93,8 @@ public DirContextOperations authenticate(Authentication authentication) {
9393
// with the returned DN.
9494
if (user == null && getUserSearch() != null) {
9595
DirContextOperations userFromSearch = getUserSearch().searchForUser(username);
96-
user = bindWithDn(userFromSearch.getDn().toString(), username, password);
96+
user = bindWithDn(userFromSearch.getDn().toString(), username, password,
97+
userFromSearch.getAttributes());
9798
}
9899

99100
if (user == null) {
@@ -106,6 +107,11 @@ public DirContextOperations authenticate(Authentication authentication) {
106107

107108
private DirContextOperations bindWithDn(String userDnStr, String username,
108109
String password) {
110+
return bindWithDn(userDnStr, username, password, null);
111+
}
112+
113+
private DirContextOperations bindWithDn(String userDnStr, String username,
114+
String password, Attributes attrs) {
109115
BaseLdapPathContextSource ctxSource = (BaseLdapPathContextSource) getContextSource();
110116
DistinguishedName userDn = new DistinguishedName(userDnStr);
111117
DistinguishedName fullDn = new DistinguishedName(userDn);
@@ -121,8 +127,9 @@ private DirContextOperations bindWithDn(String userDnStr, String username,
121127
.extractControl(ctx);
122128

123129
logger.debug("Retrieving attributes...");
124-
125-
Attributes attrs = ctx.getAttributes(userDn, getUserAttributes());
130+
if (attrs == null || attrs.size()==0) {
131+
attrs = ctx.getAttributes(userDn, getUserAttributes());
132+
}
126133

127134
DirContextAdapter result = new DirContextAdapter(attrs, userDn,
128135
ctxSource.getBaseLdapPath());

0 commit comments

Comments
 (0)