Spring LDAP Auth遇到问题

时间:2019-05-09 21:08:47

标签: java spring-boot authentication ldap

所以这是我第一次与Spring合作,所以请多多包涵!

我很确定问题是我对DnPatterns和组搜索基础的设置不正确。

我正在尝试连接一个外部AD。使用广告资源管理器,我找到了一个条目,下面是用户的dn,然后是他们通常用于登录的ID登录

在AD Explorer视图中用户的个人资料中所听的

DN -> CN=LastName\, FirstName, OU=Users,OU=Calgary,DC=CORP,DC=DEPARTMENT,DC=com

用户名和密码用户将在登录时提供:

UserName ->  LastFirst5
Password ->  Password

在目录浏览器中访问用户信息的路径如图所示

DC=CORP,DC=DEPARTMENT,DC=com -> OU=Calgary -> OU=Users -> CN=LastName,FirstName

这是我的配置设置:

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .anyRequest().fullyAuthenticated()
                .and()
                .formLogin();
    }


    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .ldapAuthentication()
                .userDnPatterns("DC=corp,DC=department,DC=com")
                .groupSearchBase("OU=Users,OU=Calgary,DC=CORP,DC=Department,DC=com")
                .contextSource()
                .url("ldap://corp.Ad.com/")
                .and()
                .passwordCompare()
                .passwordEncoder(new LdapShaPasswordEncoder())
                .passwordAttribute("userPassword");
    }

1 个答案:

答案 0 :(得分:1)

  • 首先,上下文源URL应包含用于搜索和/或验证用户身份的基本DN。

    .contextSource()
      .url('ldap://corp.Ad.com:389/DC=CORP,DC=DEPARTMENT,DC=com')
    
  • userDnPatterns()用于匹配用户登录名中出现的用户登录名-(如果显示!)-然后服务器替换登录名用户为{0}占位符输入的名称,然后通过从LDAP URL附加基本dn来重新创建用户dn。问题在于,在您的目录中,用户dn是不是根据其用户名而是根据其cn属性而构建的,而不是根据其用户名构建的,因此您无法进行匹配(LastName, FirstName ≠ LastFirst5 ),因此您无法使用此方法对用户进行身份验证(但如果用户名和cn等效,则正确的模式应类似于cn={0},ou=Users)。

  • 另一方面,
  • userSearchFilter()可用于匹配用户使用常规搜索过滤器提供的登录名。可选地,userSearchBase()可以与它一起使用,以设置可选的分支rdn,用户条目位于该分支并从中执行搜索,如果未指定,则搜索包括从LDAP URL的基本dn开始的整个目录。 / p>

    .and()
      .userSearchBase('ou=Users,ou=Calgary')
      .userSearchFilter('(sAMAccountName={0})')
    

    请注意,如果您在OU=Users,OU=OtherCity,DC=...之类的其他城市有用户,则将需要另一种配置来对他们进行身份验证,而不知道从哪个城市开始搜索。在这种情况下,您将重置搜索基础以匹配基础dn下的所有条目,并且由于只希望用户能够登录,因此可以优化过滤器 相应地:

    .and()
      .userSearchBase('')
      .userSearchFilter('(&(sAMAccountName={0})(objectClass=user)')
    
  • 如果没有groupSearchBase(),则不需要groupSearchFilter(),这两个仅用于授权(验证用户具有给定角色<=>是给定组的成员) 。

  • 要能够搜索和匹配用户条目,身份验证请求本身需要连接并绑定到LDAP服务器,大多数服务器不接受匿名绑定,因此您可能需要设置managerDn()和managerPassword ():

    .contextSource()
      .url('ldap://corp.Ad.com:389/DC=CORP,DC=DEPARTMENT,DC=com')
      .managerDn('admin')
      .managerPassword('password')
    

https://community.jaspersoft.com/documentation/jasperreports-server-authentication-cookbook/performing-ldap-user-search