Java 使用LDAP对使用spring security的ADAM进行身份验证
我正在尝试使用SpringSecurity获取一个Java应用程序,以便与我设置的本地ADAM实例进行对话 我已成功安装ADAM和安装程序,如下所示Java 使用LDAP对使用spring security的ADAM进行身份验证,java,authentication,spring-security,adam,Java,Authentication,Spring Security,Adam,我正在尝试使用SpringSecurity获取一个Java应用程序,以便与我设置的本地ADAM实例进行对话 我已成功安装ADAM和安装程序,如下所示 在本地主机上运行的实例:389 Root是O=Company 名为OU=Company Users(OrganizationalUnit)的子级 一个叫做CN=Mike Q(用户)的孩子 uid=mike和password=welcome 然后我设置了SpringSecurity(版本3.0.3、SpringFramework 3.0.
- 在本地主机上运行的实例:389
- Root是
O=Company
- 名为
(OrganizationalUnit)的子级OU=Company Users
- 一个叫做
(用户)的孩子CN=Mike Q
和uid=mike
password=welcome
- 一个叫做
- 名为
<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"/>
运行此命令时,会出现以下错误
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)
原因:javax.naming.AuthenticationException:[LDAP:错误代码49-8009030C:LDAPPER:DSID-0C0900336,注释:AcceptSecurityContext错误,数据2030,vece]
位于com.sun.jndi.ldap.LdapCtx.mapErrorCode(LdapCtx.java:3041)
位于com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2987)
位于com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2789)
位于com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2703)
位于com.sun.jndi.ldap.LdapCtx.(LdapCtx.java:293)
位于com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:175)
位于com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:193)
位于com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:136)
位于com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:66)
位于javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:667)
位于javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
位于javax.naming.InitialContext.init(InitialContext.java:223)
位于javax.naming.ldap.InitialLdapContext。(InitialLdapContext.java:134)
位于org.springframework.ldap.core.support.LdapContextSource.getDirContextInstance(LdapContextSource.java:43)
位于org.springframework.ldap.core.support.AbstractContextSource.createContext(AbstractContextSource.java:254)
如果有人能指出我错在哪里,我将不胜感激。此时,我只想使用LDAP对输入的用户/密码进行身份验证,没有比这更复杂的了
我还对一些一般性问题感兴趣,因为这是我第一次涉足LDAP领域
- LDAP是否区分大小写
- 空间是否最好避免
- 避免在LDAP查询中以明文形式发送密码的一般用例/最佳实践是什么
- 好的,我花了很多时间来解决这个问题,下面是答案
错误代码2030表示用户的DN无效
经过一些尝试和错误,这里是一个配置,可以正常工作,用户搜索。(您可能可以使用安全名称空间重写它,但在我处理这个问题时,使用原始bean定义更为清晰)
其他一些随机的花絮
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)
希望所有这些都能帮助其他人。我通过在同一个基本DN中添加您试图用作管理员角色成员的用户,解决了此问题。 希望有帮助
<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"/>
<value>cn={0},cn=People</value>
<constructor-arg index="0" value="cn=People"/>
<constructor-arg index="1" value="(cn={0})"/>
@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)