java - 具有身份验证的 Spring Boot 自定义用户
问题描述
我正在尝试使用我想要的属性进行自定义用户并使用身份验证,CustomUser 扩展了 spring User,用户由实现 UsersDetailsService 的 CustomProvider 返回
@Service
@Qualifier("UserDetailsService")
public class CustomUserDetailsService implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Override
@Transactional
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
User user=userRepository.findByEmail(email);
return new CustomUser(user.getName(),user.getPassword(),buildUserAuthority(user.getRoles()));
}
private List<GrantedAuthority> buildUserAuthority(Set<Role> userRoles) {
Set<GrantedAuthority> setAuths = new HashSet<GrantedAuthority>();
// add user's authorities
for (Role userRole : userRoles) {
setAuths.add(new SimpleGrantedAuthority(userRole.getRole()));
}
List<GrantedAuthority> Result = new ArrayList<GrantedAuthority>(setAuths);
return Result;
}
@Getter
@Setter
public class CustomUser extends User {
public CustomUser(String username, String password, Collection<? extends GrantedAuthority> authorities) {
super(username, password, authorities);
}
public String firstName;
public String lastName;
}
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
@Qualifier("UserDetailsService")
private UserDetailsService customUserDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder auth)
throws Exception {
/* auth.
jdbcAuthentication()
.usersByUsernameQuery(usersQuery)
.authoritiesByUsernameQuery(rolesQuery)
.dataSource(dataSource)
.passwordEncoder(bCryptPasswordEncoder);
*/
auth.userDetailsService(customUserDetailsService);
}
}
我有两个问题:
1-我已经评论了 auth.jdbcAuthentication 因为我不能让身份验证和 customProvider 一起工作,我如何使用 customuser 的数据库身份验证?
2-如果我评论 jdbcAuthentication customuser 工作,但是当我得到委托人时,密码为空: authentication.getPrincipal().getPassword()
更新 :
我已经通过 eraseCredentials(false) 解决了 2,但仍然无法同时执行这两个操作(使用自定义用户进行身份验证)
解决方案
老答案:
我已经解决了这个问题:
auth.eraseCredentials(false).userDetailsService(customUserDetailsService).and().jdbcAuthentication()
.usersByUsernameQuery(usersQuery)
.authoritiesByUsernameQuery(rolesQuery)
.dataSource(dataSource)
.passwordEncoder(bCryptPasswordEncoder);
更新:
我发现不需要使用 2 种身份验证,因为 spring 会与返回的用户验证密码。
推荐阅读
- angular - Angular 9生产错误:无法设置(抽象)类MyFilter {}的属性ɵfac,它只有一个getter
- html - ESP32 上自动驾驶汽车的 HTML 界面
- javascript - 移动内容时的 Vue 过渡
- emacs - (厄运)emacs:lsp-mode 在 sbt-start 上找不到项目根目录
- c# - 实体框架代码优先 - 在域模型上使用接口
- php - 如何让合适的人访问此功能?
- javascript - ajax 或 jquery 不显示数据 Laravel
- python - django:当文件不存在时重定向后意外的文件下载
- masm - masm mov mybyte, -130 为什么这样有效?
- c - C:在结构中初始化指针时出现分段错误