使用 LDAP 的 Spring Security - 登录后出错

Posted

技术标签:

【中文标题】使用 LDAP 的 Spring Security - 登录后出错【英文标题】:Spring Security with LDAP - error after login 【发布时间】:2021-02-13 20:26:21 【问题描述】:

我已经设法让我的 Spring 项目与 Security 和 LDAP 一起使用,但只能使用 LDIF 文件。现在我正在尝试通过使用 LDAP 服务器对其进行配置来使其工作,但我只能做到这一点 - 通过使用正确的凭据登录我的网站上没有任何错误,但我无法获得任何进一步的信息。

我一直在谷歌搜索这些错误,但找不到任何类似/有用的信息。也许一直在使用 Spring LDAP 的人知道如何正确配置项目以使用 LDAP 服务器?

这是控制台抛出的内容:

2020-10-31 18:32:25.298 DEBUG 21100 --- [nio-8080-exec-4] w.a.UsernamePasswordAuthenticationFilter : Request is to process authentication
2020-10-31 18:32:25.298 DEBUG 21100 --- [nio-8080-exec-4] o.s.s.authentication.ProviderManager     : Authentication attempt using org.springframework.security.ldap.authentication.LdapAuthenticationProvider
2020-10-31 18:32:25.298 DEBUG 21100 --- [nio-8080-exec-4] o.s.s.l.a.LdapAuthenticationProvider     : Processing authentication request for user: MY_USERNAME
2020-10-31 18:32:25.302 DEBUG 21100 --- [nio-8080-exec-4] o.s.s.l.a.BindAuthenticator              : Attempting to bind as cn=MY_USERNAME,ou=MY_GROUP,dc=FOO,dc=FOO2
2020-10-31 18:32:25.302 DEBUG 21100 --- [nio-8080-exec-4] s.s.l.DefaultSpringSecurityContextSource : Removing pooling flag for user cn=MY_USERNAME,ou=MY_GROUP,dc=FOO,dc=FOO2
2020-10-31 18:32:25.384 DEBUG 21100 --- [nio-8080-exec-4] o.s.s.l.a.BindAuthenticator              : Retrieving attributes...
2020-10-31 18:32:25.408 DEBUG 21100 --- [nio-8080-exec-4] .s.s.l.u.DefaultLdapAuthoritiesPopulator : Getting authorities for user cn=MY_USERNAME,ou=MY_GROUP,dc=FOO,dc=FOO2
2020-10-31 18:32:25.408 DEBUG 21100 --- [nio-8080-exec-4] .s.s.l.u.DefaultLdapAuthoritiesPopulator : Searching for roles for user 'MY_USERNAME', DN = 'cn=MY_USERNAME,ou=MY_GROUP,dc=FOO,dc=FOO2', with filter (uniqueMember=0) in search base ''
2020-10-31 18:32:25.409 DEBUG 21100 --- [nio-8080-exec-4] o.s.s.ldap.SpringSecurityLdapTemplate    : Using filter: (uniqueMember=cn=MY_USERNAME,ou=MY_GROUP,dc=FOO,dc=FOO2)
2020-10-31 18:32:25.490 DEBUG 21100 --- [nio-8080-exec-4] o.s.s.w.header.writers.HstsHeaderWriter  : Not injecting HSTS header since it did not match the requestMatcher org.springframework.security.web.header.writers.HstsHeaderWriter$SecureRequestMatcher@18100b72
2020-10-31 18:32:25.490 DEBUG 21100 --- [nio-8080-exec-4] w.c.HttpSessionSecurityContextRepository : SecurityContext is empty or contents are anonymous - context will not be stored in HttpSession.
2020-10-31 18:32:25.490 DEBUG 21100 --- [nio-8080-exec-4] s.s.w.c.SecurityContextPersistenceFilter : SecurityContextHolder now cleared, as request processing completed
2020-10-31 18:32:25.494 ERROR 21100 --- [nio-8080-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception

org.springframework.ldap.UncategorizedLdapException: Uncategorized exception occured during LDAP processing; nested exception is javax.naming.NamingException: [LDAP: error code 1 - 00002020: Operation unavailable without authentication]; remaining name ''

这是我的 application.properties:

spring.ldap.embedded.base-dn=dc=FOO,dc=FOO2
spring.ldap.embedded.port=8389
spring.ldap.urls=ldap://xx.x.x.xx:389/dc=FOO,dc=FOO2
spring.ldap.embedded.validation.enabled=false
spring.ldap.base=ou=MY_GROUP,dc=FOO,dc=FOO2

以及扩展 WebSecurityConfigurerAdapter 的 cofig 类:

    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception
    
        auth
                .ldapAuthentication()
                .userDnPatterns("cn=0,ou=MY_GROUP")
                .contextSource()
                .url("ldap://xx.x.x.xx:389/dc=FOO,dc=FOO2");
    

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

【问题讨论】:

【参考方案1】:

遇到了同样的问题 - 您的 LDAP 服务器需要绑定身份验证。 在下面添加解决了它:

.managerDn("manager").managerPassword("password")

WebSecurityConfigurerAdapter(粗体):

认证 .ldapAuthentication() .userDnPatterns("uid=0,ou=users,DC=company,DC=com") .groupSearchBase("ou=groups") .contextSource() .url("ldap://X.X.X.X:389/DC=company,DC=com") .managerDn("manager").managerPassword("password") 。和() .passwordCompare() .passwordEncoder(新 BCryptPasswordEncoder()) .passwordAttribute("userPassword");

【讨论】:

以上是关于使用 LDAP 的 Spring Security - 登录后出错的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Security 的 ldap 身份验证

如何使用带有 LDAP 的 Spring Security 获取用户信息

使用 LDAP 的 Spring Security - 登录后出错

使用 Spring security 2.0.3 的 LDAP 身份验证

使用 Spring Security 3 进行 LDAP 身份验证

使用 spring security ldap 禁用基本身份验证