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

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

时间:2023-04-22 14:13:29浏览次数:38  
标签:return BCryptPasswordEncoder 用户 校验 密码 Override 加密 public

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

核心代码实现

创建一个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

相关文章

  • C语言常见的加密库
    C语言加密库有很多,以下是一些常见的加密库:OpenSSL:一个功能强大的开源加密库,提供了各种加密算法和协议的实现,包括对称加密、公钥加密、数字签名和证书管理等。Libsodium:一个现代化的加密库,提供了高级加密、公钥加密、哈希函数等,被广泛用于网络通信、存储和加密货币等领域。Bota......
  • python加密库
    Python加密库有很多,以下是一些常见的加密库:PyCrypto:Python的加密库,提供了各种加密算法的实现,包括对称加密、公钥加密、哈希函数等。cryptography:Python的加密库,提供了各种加密算法和协议的实现,包括对称加密、公钥加密、数字签名和证书管理等。M2Crypto:Python的加密库,提供了Ope......
  • JavaScript加密库
    JavaScript加密库有很多,以下是一些常见的加密库:CryptoJS:一个纯JavaScript编写的加密库,提供了各种加密算法和编码方式的实现,包括对称加密、哈希函数、消息认证码、数字签名等。sjcl:一个JavaScript编写的加密库,提供了对称加密、公钥加密、哈希函数等,支持多种加密算法和模式。for......
  • 准备工作、数据库校验用户准备工作
    准备工作1、添加依赖<!--redis依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!--fastjson依赖-->......
  • Laravel10 简单使用 Auth 生成 Token 与登录并获取用户信息
    参考https://learnku.com/docs/laravel/10.x/authenticationmd/14876https://learnku.com/docs/laravel/10.x/sanctummd/14914https://learnku.com/articles/39646环境软件/系统版本说明windows10php8.2.5-nts-Win32-vs16-x64composer2.5.5larave......
  • 文章学习:基于AVX-512指令集的同态加密算法中大整数运算性能优化与突破
    学习文章:英特尔×同态科技|基于AVX-512指令集的同态加密算法中大整数运算性能优化与突破文章人工智能的安全隐患ChatGPT的成功大部分来源于海量的数据支撑和丰富的数据维度,基于13亿参数量的庞大模型,随着用户的不断涌入,ChatGPT不断迭代进化新的“知识”,而在模型表达能力的增......
  • vba调用MD5函数进行加密
    vba调用MD5进行加密...以下代码来着网络...这里搬运为了便捷使用查找,无其他用途MD5函数源码,需将下面源码复制到Excel的模块中,调用MD5函数即可进行加密,第一个参数为加密的文本,第二参数为加密类型,如:32,16.PrivateConstBITS_TO_A_BYTE=8PrivateConstBYTES_TO_A_WORD=4Pr......
  • 前后端分离项目登录校验流程、分析需要修改的地方
    前后端分离项目登录校验流程、分析需要修改的地方登录校验流程 原理初探想要知道如何实现自己的登录流程就必须要先知道入门案例中的SpringSecurity的流程。前后端分离项目登录校验流程、分析需要修改的地方......
  • window的shell怎么查看当前用户名
    在Windows的命令行界面下,可以使用%username%的环境变量来获取当前用户名。具体操作步骤如下:打开cmd命令提示符。可以使用Win+R组合键打开运行窗口,输入cmd命令,然后点击“确定”按钮。在命令提示符下输入echo%username%命令。按下回车键,在命令行界面中就可......
  • 加密与解密x64逆向——寄存器和函数调用
    64位软件逆向技术寄存器本节讨论的x64是AMD和INTEL64的合成,是指与现有x86兼容的64位CPU。在64位系统中,内存地址为64位。x64系统通用寄存器的名称,第一个字母从E改为R“RAX”,大小扩展到64位,数量增加8个,扩充了8个128位XMM寄存器。函数1.栈平衡RSP用来保存当前的栈顶指针,每8个......