Java SpringLDAP身份验证出现问题

Java SpringLDAP身份验证出现问题,java,spring-boot,authentication,ldap,Java,Spring Boot,Authentication,Ldap,这是我第一次和Spring一起工作,所以请容忍我 我很确定问题在于我对DnPatterns和group search base的设置不正确 有一个外部广告,我正试图连接。使用ad explorer,我发现了一个条目,下面是用户的dn,然后是他们通常用于登录的登录id 作为AD Explorer视图中用户配置文件中的列表 DN -> CN=LastName\, FirstName, OU=Users,OU=Calgary,DC=CORP,DC=DEPARTMENT,DC=com 用户登录

这是我第一次和Spring一起工作,所以请容忍我

我很确定问题在于我对DnPatterns和group search base的设置不正确

有一个外部广告,我正试图连接。使用ad explorer,我发现了一个条目,下面是用户的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");
    }
  • 首先,上下文源url应包括用于搜索和/或验证用户的基本DN

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

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

    .and()
      .userSearchBase('ou=Users,ou=Calgary')
      .userSearchFilter('(sAMAccountName={0})')
    
    请注意,如果您在其他城市有用户,如
    OU=users,OU=OtherCity,DC=…
    ,则需要另一种配置,以便在不知道从哪个城市开始搜索的情况下对其进行身份验证。在这种情况下,您将重置搜索库以匹配基本dn下的所有条目,并且由于您只希望用户能够登录,因此您将优化过滤器 因此:

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

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


感谢您的详细回复!我会试试看,url中的389号是什么?”ldap://corp.Ad.com:389/DC=CORP,DC=DEPARTMENT,DC=com'它只是指定ldap端口,它是可选的,默认为389,但我认为最好是显式的。ldap URL遵循以下通用语法:
ldap://主机[:端口]/[dc=xxx]
.contextSource()
  .url('ldap://corp.Ad.com:389/DC=CORP,DC=DEPARTMENT,DC=com')
  .managerDn('admin')
  .managerPassword('password')