Spring 安全自定义登录回退
Spring Security Custom Login Fallback
有人可以指点我一些资源,这些资源可以指导我如何实现自定义 spring 安全身份验证,如果字段为该用户存在 ldap 用户名,并且无法进行身份验证(因为 ldap 用户名不存在或给定的密码未对服务器上的用户名进行身份验证)将尝试对本地数据库中保存的本地密码进行身份验证对于用户。
谢谢。
似乎没有太多针对该特定问题的好答案。
虽然我还没有建立一个完整的 LDAP 示例,但在 @Marcus 在评论中链接的 ldap sample 中应该有一个良好的开端。话虽如此,您可以轻松地按照您想要的顺序注册两个身份验证提供程序,默认的 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 sample 会让你开始,你可以用例如替换那个例子中的 MapCustomUserRepository
一个 spring 数据 @Repository
.
有人可以指点我一些资源,这些资源可以指导我如何实现自定义 spring 安全身份验证,如果字段为该用户存在 ldap 用户名,并且无法进行身份验证(因为 ldap 用户名不存在或给定的密码未对服务器上的用户名进行身份验证)将尝试对本地数据库中保存的本地密码进行身份验证对于用户。
谢谢。
似乎没有太多针对该特定问题的好答案。
虽然我还没有建立一个完整的 LDAP 示例,但在 @Marcus 在评论中链接的 ldap sample 中应该有一个良好的开端。话虽如此,您可以轻松地按照您想要的顺序注册两个身份验证提供程序,默认的 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 sample 会让你开始,你可以用例如替换那个例子中的 MapCustomUserRepository
一个 spring 数据 @Repository
.