数据库校验用户核心代码实现
核心代码实现
创建一个UserDetailsService接口,重写其中的方法。更加用户名从数据库中查询信息
@Service public class UserDetailsServiceImpl implements UserDetailsService { @Autowired private UserMapper userMapper; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { //根据用户名查询用户信息 LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(User::getUserName,username); User user = userMapper.selectOne(wrapper); //如果查询不到数据就通过抛出异常来给出提示 if(Objects.isNull(user)){ throw new RuntimeException("用户名或密码错误"); } //TODO 根据用户查询权限信息 添加到LoginUser中 //封装成UserDetails对象返回 return new LoginUser(user); } }
因为UserDetailsService的方法的返回值是UserDetails类型,所以需要定义一个类,实现该接口,把用户信息封装在其中。
@Data @NoArgsConstructor @AllArgsConstructor public class LoginUser implements UserDetails { private User user; @Override public Collection<? extends GrantedAuthority> getAuthorities() { return null; } @Override public String getPassword() { return user.getPassword(); } @Override public String getUsername() { return user.getUserName(); } @Override public boolean isAccountNonExpired() { return true; } @Override public boolean isAccountNonLocked() { return true; } @Override public boolean isCredentialsNonExpired() { return true; } @Override public boolean isEnabled() { return true; } }
注意:如果要测试,需要往用户表中写入用户数据,并且如果你想让用户的密码是明文存储,需要在密码前加{noop}。例如
这样登陆的时候就可以用sg作为用户名,1234作为密码来登陆了。
用户密码加密存储
实际项目中我们不会把密码明文存储在数据库中。
默认使用的PasswordEncoder要求数据库中的密码格式为:{id}password.它会根据id去判断密码的加密方式。但是我们一般不会采用这种方式。所以就需要替换PasswordEncoder.
我们一般使用SpringSecurity为我们提供的BCryptPasswordEncoder。
我们只需要使用把BCryptPasswordEncoder对象注入Spring容器中,SpringSecurity就会使用该PasswordEncoder来进行密码校验。
我们可以定义一个SpringSecurity的配置类,SpringSecurity要求这个配置类要继承WebSecurityConfigurerAdapter。
@Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { //创建BCryptPasswordEncoder注入容器 @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }
测试类加密且判断和加密前是否一样
@Autowired private PasswordEncoder passwordEncoder; @Test public void TestBCryptPasswordEncoder() { // BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); // $2a$10$LWI8ZDyUUCZJ2ctnK7Ugv.xZ1mHVUL.qJQln67eZfMIuF/5PB3gVe System.out.println(passwordEncoder.matches("1234", "$2a$10$LWI8ZDyUUCZJ2ctnK7Ugv.xZ1mHVUL.qJQln67eZfMIuF/5PB3gVe")); // String encode = passwordEncoder.encode("1234"); // String encode2 = passwordEncoder.encode("1234"); // System.out.println(encode); // System.out.println(encode2); }标签:return,BCryptPasswordEncoder,用户,校验,密码,Override,加密,public From: https://www.cnblogs.com/wsfj/p/17342966.html