我正在尝试使用spring-security与我已设置的本地ADAM实例进行通信。
我已成功安装ADAM并进行如下安装....
O=Company
OU=Company Users
的儿童(orgnizationalUnit)
CN=Mike Q
(用户)uid = mike
和password = welcome
然后我设置了spring-security(版本3.0.3,spring-framework 3.0.4和spring-ldap 1.3.0)。 Spring文件
<security:ldap-server id="contextSource" url="ldap://localhost:389/o=Company"/>
<security:authentication-manager>
<security:ldap-authentication-provider user-dn-pattern="uid={0},ou=Company Users"/>
</security:authentication-manager>
<bean class="com.xxx.test.TestAuthentication" lazy-init="false"/>
和TestAuthentication
public class TestAuthentication
{
@Autowired
private AuthenticationManager authenticationManager;
public void initialise()
{
Authentication authentication = new UsernamePasswordAuthenticationToken( "mike", "welcome" );
Authentication reponseAuthentication = authenticationManager.authenticate( authentication );
}
}
运行此操作我收到以下错误
Caused by: javax.naming.AuthenticationException: [LDAP: error code 49 - 8009030C: LdapErr: DSID-0C090336, comment: AcceptSecurityContext error, data 2030, vece]
at com.sun.jndi.ldap.LdapCtx.mapErrorCode(LdapCtx.java:3041)
at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2987)
at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2789)
at com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2703)
at com.sun.jndi.ldap.LdapCtx.<init>(LdapCtx.java:293)
at com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:175)
at com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:193)
at com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:136)
at com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:66)
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:667)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
at javax.naming.InitialContext.init(InitialContext.java:223)
at javax.naming.ldap.InitialLdapContext.<init>(InitialLdapContext.java:134)
at org.springframework.ldap.core.support.LdapContextSource.getDirContextInstance(LdapContextSource.java:43)
at org.springframework.ldap.core.support.AbstractContextSource.createContext(AbstractContextSource.java:254)
如果有人能指出我出错的地方,我将不胜感激。此时我只想使用LDAP对输入的用户/密码进行身份验证,而不是更复杂。
我也对一些一般观点感兴趣,因为这是我第一次涉足LDAP世界。
答案 0 :(得分:4)
好的,所以我花了很多时间来解决这个问题。
错误代码2030表示用户的DN无效。
经过一些试验和错误后,这是一个有效的配置,用户可以正常搜索。 (您可以使用安全命名空间重写它,但在我正在处理它时,使用原始bean定义更清楚。)
<bean id="contextSource"
class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
<constructor-arg value="ldap://localhost:389/cn=Sandbox,dc=ITOrg"/>
<property name="userDn" value="cn=superuser,cn=People,cn=Sandbox,dc=ITOrg"/>
<property name="password" value="xxxxxx"/>
</bean>
<bean id="ldapAuthProvider"
class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider">
<constructor-arg>
<bean class="org.springframework.security.ldap.authentication.BindAuthenticator">
<constructor-arg ref="contextSource"/>
<property name="userDnPatterns">
<list>
<value>cn={0},cn=People</value>
</list>
</property>
</bean>
</constructor-arg>
</bean>
<bean id="userSearch" class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch">
<constructor-arg index="0" value="cn=People"/>
<constructor-arg index="1" value="(cn={0})"/>
<constructor-arg index="2" ref="contextSource"/>
</bean>
关键是
<property name="userDn" value="cn=superuser,cn=People,cn=Sandbox,dc=ITOrg"/>
在上下文源中指定userDn时,它必须是FULL DN(它不只是附加它在url(构造函数arg)中提供的基础。
使用BindAuthentication
时<value>cn={0},cn=People</value>
此值是上下文源baseDn之上的后缀。
配置UserSearch时
<constructor-arg index="0" value="cn=People"/>
<constructor-arg index="1" value="(cn={0})"/>
我无法让它与cn=People
在第二个arg中工作,但这似乎工作正常。请注意,您可以使用用户的属性,例如(uid={0})
这里有一些使用bean定义的示例代码......
@Autowired
private LdapUserSearch ldapUserSearch;
@Autowired
private AuthenticationProvider authenticationProvider;
public void initialise()
{
DirContextOperations dirContextOperations = ldapUserSearch.searchForUser( "username" );
Authentication authentication = authenticationProvider.authenticate( new UsernamePasswordAuthenticationToken( "username", "password" ) );
}
其他一些随机的标题......
Error 52b - Invalid password
[LDAP: error code 32 - 0000208D: NameErr: DSID-031521D2, problem 2001 (NO_OBJECT), data 0, best match of: 'CN=Sandbox,DC=ITOrg'
- This means the user is not in the administrator role (probably)
希望这一切都有助于其他人。
答案 1 :(得分:0)
我通过添加您尝试在同一基本DN中作为管理员角色成员使用的用户来解决此问题。 希望有所帮助