spring-security - Spring Security 自定义登录回退
问题描述
有人可以向我指出一些资源,这些资源可以指导我如何实现自定义弹簧安全身份验证,如果该用户的 ldap 用户名字段存在,则首先在 ldap 服务器上测试找到的用户的凭据,并且失败要进行身份验证(因为 ldap 用户名不存在或给定的密码未验证服务器上的用户名),将尝试针对在本地数据库中为用户保留散列的本地密码进行身份验证。
谢谢你。
解决方案
对于该特定问题,似乎没有太多好的答案。
虽然我还没有建立一个完整的 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
。
推荐阅读
- r - 分组数据框中的时间序列
- r - 使用 docker 托管 R 管道工 API
- python - 使用 datetime 对象进行 seaborn 绘图
- oracle - 解析存储到记录中的变量
- javascript - 在 React-Datepicker 中禁用日期时间范围
- python - 在 Raspberry Pi 4 上使用 OpenCV 进行人脸检测会导致分割错误
- laravel - 如何在 laravel 中将记录或 eloquent 作为参数传递给控制器
- php - 在 WooCommerce 中为自定义字段使用 wc_get_orders() orderby 参数
- azure - 无法使用部署在 Azure 中的 Neo4j VM
- javascript - 滚动 REACT 时获取 API 数据