spring安全自定义登录回退

qnakjoqk  于 2021-09-29  发布在  Java
关注(0)|答案(1)|浏览(396)

有人能告诉我一些参考资料吗?这些资料可以指导我如何实现自定义spring安全身份验证,首先在ldap服务器上测试找到的用户的凭据,如果该用户的ldap用户名字段存在,如果无法进行身份验证(因为ldap用户名不存在,或者给定的密码没有对服务器上的用户名进行身份验证),则会尝试根据本地数据库中散列的用户本地密码进行身份验证。
非常感谢。

nkoocmlb

nkoocmlb1#

对于这个特定的问题,似乎没有太多好的答案。
虽然我还没有给出一个完整的工作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);
    }

}

显然,您需要提供自己的用户详细信息,它使用数据库而不是内存。username-password示例将帮助您开始使用它,您可以替换 MapCustomUserRepository 在该示例中,使用例如Spring Data @Repository .

相关问题