Spring Security - 从数据库中检索用户信息(一)

时间 2021/5/28 16:00:53 加载中...

从数据库中检索用户信息

我们需要重写重写检索用户的逻辑,从数据库中去检索,因此我们重新定义 UserDetailsService

在 WebSecurityConfig 中添加如下代码:

  1. @Bean
  2. UserDetailsService customUserService() { // 注册UserDetailsService 的bean
  3. return new CustomUserService();
  4. }
  5. @Override
  6. protected void configure(AuthenticationManagerBuilder auth) throws Exception {
  7. auth.userDetailsService(customUserService())
  8. .passwordEncoder(new BCryptPasswordEncoder());
  9. }

.passwordEncoder(new BCryptPasswordEncoder())
指定密码的加密方式,数据库中的密码应该是加密的,防止脱库导致用户密码丢失。

我们将 AuthenticationManagerBuilder 中的用户检索服务类(即 userDetailService )进行自定义

CustomUserService.java 的具体内容如下:

  1. import org.springframework.security.core.GrantedAuthority;
  2. import org.springframework.security.core.authority.SimpleGrantedAuthority;
  3. import org.springframework.security.core.userdetails.User;
  4. import org.springframework.security.core.userdetails.UserDetails;
  5. import org.springframework.security.core.userdetails.UserDetailsService;
  6. import org.springframework.security.core.userdetails.UsernameNotFoundException;
  7. import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
  8. import java.util.ArrayList;
  9. import java.util.List;
  10. public class CustomUserService implements UserDetailsService {
  11. @Override
  12. public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
  13. try {
  14. // 检索用户库中的信息
  15. String password = "123";
  16. password = new BCryptPasswordEncoder().encode(password);
  17. List<GrantedAuthority> authorities = new ArrayList<>();
  18. authorities.add(new SimpleGrantedAuthority("abc"));
  19. boolean enabled = true;
  20. boolean accountNonExpired = true;
  21. boolean credentialsNonExpired = true;
  22. boolean accountNonLocked = true;
  23. User user = new User(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);
  24. return user;
  25. } catch (Exception e) {
  26. throw new UsernameNotFoundException("用户名或密码不正确");
  27. }
  28. }
  29. }

loadUserByUsername 方法是根据用户名去检索用户的真实密码以及权限。然后 spring security 内部再去和输入的密码作比较。

这里为了方便起见,直接返回了一个密码是 123 ,角色是 abc 的用户。
当在页面输入的密码是 123 时,就可以登录成功,否则就会登录失败。

思考

思考:没自定义之前的 用户检索服务类 是哪个呢,在哪里定义的?

扫码分享
版权说明
作者:SQBER
文章来源:http://www.sqber.com/articles/spring-security-retrive-user-from-db.html
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。