数据库校验用户核心代码实现、用户密码加密存储

数据库校验用户核心代码实现

核心代码实现

创建一个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);
        }
posted @ 2023-04-22 13:57  肥宅快乐水~  阅读(100)  评论(0)    收藏  举报