Java 使用LDAP对使用spring security的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.

我正在尝试使用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.4和SpringLDAP 1.3.0)。弹簧锉

  <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)