首页 > 解决方案 > Spring Security 自定义登录回退

问题描述

有人可以向我指出一些资源,这些资源可以指导我如何实现自定义弹簧安全身份验证,如果该用户的 ldap 用户名字段存在,则首先在 ldap 服务器上测试找到的用户的凭据,并且失败要进行身份验证(因为 ldap 用户名不存在或给定的密码未验证服务器上的用户名),将尝试针对在本地数据库中为用户保留散列的本地密码进行身份验证。

谢谢你。

标签: spring-securityldap

解决方案


对于该特定问题,似乎没有太多好的答案。

虽然我还没有建立一个完整的 LDAP 示例,但@Marcus 在评论中链接的ldap 示例中的那部分应该有一个好的开始。话虽如此,您可以轻松地按照您想要的顺序注册两个身份验证提供程序,默认DaoAuthenticationProvider为第二个:

@Configuration
public class SecurityConfiguration {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        // @formatter:off
        return http
            .authorizeRequests(authorizeRequests -> authorizeRequests
                .anyRequest().authenticated()
            )
            .formLogin(withDefaults())
            .authenticationProvider(ldapAuthenticationProvider())
            .authenticationProvider(daoAuthenticationProvider())
            .build();
        // @formatter:on
    }

    @Bean
    public AuthenticationProvider ldapAuthenticationProvider() {
        LdapContextSource contextSource = null; // TODO See sample for example
        return new LdapAuthenticationProvider(new BindAuthenticator(contextSource));
    }

    @Bean
    public AuthenticationProvider daoAuthenticationProvider() {
        DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
        authenticationProvider.setUserDetailsService(userDetailsService());
        return authenticationProvider;
    }

    @Bean
    public UserDetailsService userDetailsService() {
        UserDetails userDetails = User.builder()
            .username("user")
            .password("{noop}password")
            .roles("USER")
            .build();

        return new InMemoryUserDetailsManager(userDetails);
    }

}

您显然希望提供自己的用户详细信息,该详细信息使用数据库而不是内存。用户名密码示例将让您开始使用,您可以MapCustomUserRepository将该示例中的 替换为例如 spring data @Repository


推荐阅读