Spring Security在基于LDAP的身份验证中无一例外地返回“错误凭据

iqih9akk  于 2023-02-19  发布在  Spring
关注(0)|答案(1)|浏览(130)

我正在尝试创建Sprint Boot,Spring Security 6,LDAP服务器(外部而非嵌入式)的身份验证应用程序。当我旋转应用程序并提供用户名登录表单上的(uid)和密码我收到UI上显示的"凭据错误"消息。应用程序日志中未报告任何异常。我不明白是什么原因导致显示"凭据错误"消息。任何指针都非常感谢。这是我的配置文件看起来像

@Configuration
@EnableWebSecurity
public class WebSecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception {
        httpSecurity.authorizeHttpRequests().anyRequest().fullyAuthenticated()
                .and()
                .formLogin();
        httpSecurity.authenticationProvider(ldapAuthenticationProvider());
        return httpSecurity.build();
    }

    @Bean
    LdapAuthenticationProvider ldapAuthenticationProvider() {
        return new LdapAuthenticationProvider(authenticator());
    }

    @Bean
    BindAuthenticator authenticator() {
        FilterBasedLdapUserSearch search = new FilterBasedLdapUserSearch("ou=people", "(uid={0})", contextSource());
        BindAuthenticator authenticator = new BindAuthenticator(contextSource());
        authenticator.setUserSearch(search);
        return authenticator;
    }

    @Bean
    public DefaultSpringSecurityContextSource contextSource() {
        DefaultSpringSecurityContextSource dsCtx = new DefaultSpringSecurityContextSource("ldap://localhost:389/dc=example,dc=com");
        dsCtx.setUserDn("cn=admin,dc=example,dc=com");
        dsCtx.setPassword("password");

        return dsCtx;
    }
}

当我尝试使用ldapsearch命令查找用户时,我确实获得了用户信息

MacBook-Pro:springsecuritywithldapdemo$ ldapsearch -LLL -x -H ldap:// -t -b "dc=example,dc=com" "uid=jsmith1"
dn: uid=jsmith1,ou=people,dc=example,dc=com
objectClass: inetOrgPerson
description: John Smith from Accounting.  John is the project manager of the b
 uilding project, so contact him with any questions.
cn: John Smith
sn: Smith
uid: jsmith1
userPassword:: anNtaXRoMTIz

我浏览了谷歌在不同搜索中返回的许多搜索结果,其中大多数使用了较旧版本的Spring Security或使用了Spring Security 6的JDBC身份验证。我参考了YouTube教程,看看我是否做错了什么,但看起来不像。

wribegjk

wribegjk1#

首先我想感谢您,因为基于您的解决方案,我能够解决我的应用程序中的相同问题.与您的解决方案相比,我唯一的变化是:

FilterBasedLdapUserSearch search = new FilterBasedLdapUserSearch("cn=users,cn=accounts,dc=example,dc=com",
        "(uid={0})",
        contextSource());

所以你应该试试

FilterBasedLdapUserSearch search = new FilterBasedLdapUserSearch("ou=people,dc=example,dc=com", "(uid={0})", contextSource());

然后我还做了以下的改动

DefaultSpringSecurityContextSource dsCtx = new DefaultSpringSecurityContextSource(
        "ldap://localhost:389");
dsCtx.setUserDn("uid=admin,cn=users,cn=accounts,dc=example,dc=com");

在您的情况下,我认为这几乎是相同的,因为我认为您也有一个uid=admin的用户。我希望它能解决您的问题,就像它对我所做的那样

相关问题