java - 具有自定义用户名和密码查询的 Spring Security JDBC 身份验证
问题描述
我是 Spring Security 的新手,并试图在我的应用程序中实现它。数据库已经建立,并且具有与默认不同的架构。密码已使用 Oracle DB 散列方案进行散列。
这就是我的问题。我希望能够传递自定义查询以获取用户名,并且在将其与数据库中的内容进行比较之前还具有传入的密码。我该怎么做?
解决方案
您可以通过实现自定义 UserDetailsService 并覆盖其 loadUserByUsername() 方法来自定义身份验证逻辑。
public interface MembersService extends UserDetailsService {}
@Service
public class MembersServiceImpl implements MemberService{
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//custom logic to authenticate
throw new UsernameNotFoundException("User '" + username + "' not found");
}
}
在安全配置中设置此自定义用户详细信息服务
@Configuration
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
private MembersService memberService;
public WebSecurityConfiguration(MembersService memberService) {
this.memberService = memberService;
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(this.memberService).passwordEncoder(encoder());
}
}
推荐阅读
- angular - 如何确保在表单字段中使用数据的页面呈现之前从 REST 服务返回数据
- microsoft-graph-api - 文件夹移动后 OneDrive Delta 丢失事件
- vue.js - 在 Vuejs 中动态注册子组件
- amazon-web-services - 在本地部署训练有素的 Sagemaker Mxnet 对象检测模型?
- github - Github,如何在代码历史版本中搜索评论内容?
- php - Laravel应用程序未连接到Azure应用程序中的MySQL
- android - 为什么原生库有 API 限制?
- networking - 来自印度位置 gcp 的 Kubernetes 应用程序延迟问题
- java - JDK 11 的后续 LTS 版本是否会有 OpenJDK 构建?
- syntax - cond 变量没有值