代码之家  ›  专栏  ›  技术社区  ›  Sphinx

JavaSpring LDAP Auth:总是失败但在Nodejs测试类似配置很有效

  •  0
  • Sphinx  · 技术社区  · 6 年前

    对于Java/Spring,我很新。如果需要更多信息,请随时指出。

    首先,我测试了下面的代码 在运行良好的javascript(nodejs)中 .

    var ldap = require('ldapjs');
    var client = ldap.createClient({
      url: 'ldap://xx.xx.xx.xx:389'
    });
    
    client.bind('domain\\user1', 'user1_password', function (err) {
    
      if (err) {
        throw err;
        return
      }
      var opts = {
        filter: '(sAMAccountName=user2)',
        scope: 'sub',
        attributes: ['l', 'sn', 'cn', 'mail', 'displayName', 'postalCode', 'physicalDeliveryOfficeName', 'telephoneNumber' ]
      };
      client.search('dc=aaa,dc=bbb,dc=ccc', opts, function(err, res) {
        res.on('searchEntry', function(entry) {
          Object.entries(entry.object).forEach(([key, value]) => {
            console.log('Found Attribute: ', key, '; value:', value)
          })
        });
      });
    

    然后遵循本指南:

    http://forum.spring.io/forum/spring-projects/security/110491-how-to-modify-authority-after-loading-it-from-ldap

    我应用了配置 和上面一样 进入spring/security.xml,比如:

    <bean id="customUserContextMapper" class="com.my.own.util.CustomUserDetailsMapper"/>
    <sec:authentication-manager>
      <sec:ldap-authentication-provider
        user-search-base="dc=aaa,dc=bbb,dc=ccc"
        user-search-filter="(sAMAccountName={0})"
        user-context-mapper-ref="customUserContextMapper" 
      />
    </sec:authentication-manager>
    <sec:ldap-server url="ldap://xx.xx.xx.xx:389/"
         manager-dn="domain\user1" 
         manager-password="user1_password" 
    />
    

    但是 它失败了 .

    1. 如果提交(http post)一个表单( 用户名使用域\用户名 喜欢 username=domain%5Cuser1&password=user1_password&submit=Login ,它返回 原因:凭据错误

    2. 如果提交(http post)一个表单( 用户名不包含域 喜欢 username=user1&password=user1_password&submit=Login ,它返回 500错误 :

      org.springframework.ldap.namenotfoundexception:[ldap:错误代码32-0000208d:nameerr:dsid-031001e5,问题2001(没有\u对象),数据0,最佳匹配: ’ ];嵌套异常是javax.naming.namenotfoundexception:[ldap:错误代码32-0000208d:nameerr:dsid-031001e5,问题2001(没有对象),数据0,最佳匹配: ’ ];剩余名称''

    为了 第一个案子 ,该项似乎存在,但无法验证密码。所以返回 错误的凭据 .

    为了 第二个案子 ,错误似乎表明 搜索筛选器错误 (AS) CAS AD LDAP 32 error 指出)

    但我确信我输入了正确的用户名和密码,搜索过滤器与nodejs中已经测试过的相同。

    已经在这个问题上纠结了很长时间,但找不到一个解决办法。

    感谢您的建议和解决方案。

    注: 我在类的入口设置了断点= com.my.own.util.CustomUserDetailsMapper ,但它从未被触发,所以我没有附上它的代码。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Sphinx    6 年前

    最后,我发现下面的配置运行良好。

    下面 <bean id="ldapAuthProvider"> 构造两个参数 ,

    第一个参数 :它将验证最终用户在前端填写的用户名和密码。

    第二个参数 :一旦成功通过验证器,它将调用我们自己的populator( <bean class="com.my.own.util.MyCustomLdapAuthPopulator"> )分配适当的角色或做你想做的其他事情。

    <sec:authentication-manager>  
        <sec:authentication-provider 
            ref="ldapAuthProvider"
            >  
        </sec:authentication-provider>  
    </sec:authentication-manager> 
    
    <bean id="ldapAuthProvider"  
        class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider" >  
        <constructor-arg>  
            <bean id="authenticator"  
                class="org.springframework.security.ldap.authentication.BindAuthenticator">  
                <constructor-arg ref="contextSource" />  
                <property name="userSearch">  
                    <bean  
                        class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch">  
                        <constructor-arg value="dc=aaa,dc=bbb,dc=ccc" />  
                        <constructor-arg value="(sAMAccountName={0})" />  
                        <constructor-arg ref="contextSource" />  
                    </bean>  
                </property>  
            </bean>  
        </constructor-arg>
            <constructor-arg>
                <bean class="com.my.own.util.MyCustomLdapAuthPopulator">
                    <constructor-arg ref="contextSource" />
                    <constructor-arg value="dc=aaa,dc=bbb,dc=ccc" />
                    <property name="searchSubtree" value="true" />
                    <property name="ignorePartialResultException" value="true" />
                    <property name="groupSearchFilter" value="(member={0})" />
                </bean>
            </constructor-arg>
    </bean> 
    <bean id="contextSource"  
        class="org.springframework.security.ldap.DefaultSpringSecurityContextSource" >  
        <constructor-arg value="ldap://xx.xx.xx.xx:389/" />
        <property name="userDn" value="domain\user1" />    
        <property name="password" value="user1_password" />
    </bean> 
    

    下面是我们自己的populator的一个简单实现。

    import org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator;
    public class MyCustomLdapAuthPopulator extends DefaultLdapAuthoritiesPopulator {
    
        @Autowired
        public MyCustomLdapAuthPopulator(ContextSource contextSource, String groupSearchBase) {
            super(contextSource, groupSearchBase);
            // TODO Auto-generated constructor stub
        }
    
        @Override
        protected Set<GrantedAuthority> getAdditionalRoles(DirContextOperations user, String username) {
            Set<GrantedAuthority> authorities = new HashSet<GrantedAuthority>();
            authorities.add((new SimpleGrantedAuthority("ROLE_XXX")));
            return authorities;
        }
    }