SpringSecurity使用PasswordEncoder加密用户密码的示例代码

 更新时间:2024年09月10日 09:20:20   作者:睆小白  
PasswordEncoder是Spring Security库中的一个关键组件,它主要用于处理密码的安全存储和验证,本文将给大家介绍一下SpringSecurity使用PasswordEncoder加密用户密码的方法,需要的朋友可以参考下

1. 导入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

2. 配置 PasswordEncoder

在配置类中创建一个 PasswordEncoder 对象,并注入到 Spring 容器中。

@Configuration
public class SecurityConfig {
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();// 加密方式
    }
}

3. 使用 PasswordEncoder 加密用户密码

写一个Service 类,注入 PasswordEncoder 对象,在注册用户时对密码进行加密。

@Service
public class ResUserBizImpl implements ResUserBiz{
    @Autowired
    private ResUserMapper resUserMapper;

    // 注入加密器
    @Autowired
    private PasswordEncoder passwordEncoder;

    @Override
    public int register(ResUserVO user) {
        //需要先查询是否已经存在相同用户名
        // 创建条件构造器
        QueryWrapper<Resuser> queryWrapper = new QueryWrapper<>();
        // 添加条件:用户名
        queryWrapper.eq("username", user.getUsername());
        if (resUserMapper.selectOne(queryWrapper) != null) {
            // 已经存在相同用户名
            throw new RuntimeException("用户名"+user.getUsername()+"已存在");
        }
        Resuser resuser = new Resuser();
        resuser.setUsername(user.getUsername());
        // 对密码进行加密
        String encodedPassword = passwordEncoder.encode(user.getPwd());
        System.out.println("加密后的密码为:"+encodedPassword);
        resuser.setPwd(encodedPassword);
        resuser.setEmail(user.getEmail());
        resUserMapper.insert(resuser);
        return resuser.getUserid();
    }
}

测试加密情况:

在这里插入图片描述

可能出现的问题:

我在测试的时候报了MysglDataTruncation错误,提示Data truncation: Data too long for column 'pwd' at row 1(如下图),提示了密码长度过长。

这是因为 数据库中 pwd 字段长度为 50,而BCryptPasswordEncoder生成的加密密码长度通常为 60 个字符的字符串,所以出现了长度过长的错误。

在这里插入图片描述

在这里插入图片描述

解决:修改数据库字段长度。

ALTER TABLE your_table MODIFY COLUMN pwd VARCHAR(255);

4. 使用 PasswordEncoder 验证用户密码

在登录时,使用 PasswordEncoder 的matches("明文", "密文")对比用户输入的密码和数据库中存储的加密后的密码是否匹配。

    @Override
    public Resuser searchUser(ResUserVO user) {
        QueryWrapper<Resuser> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("username",user.getUsername());
        String pwd = user.getPwd();
        Resuser resuser = resUserMapper.selectOne(queryWrapper);
        if (resuser != null){
            //使用matches方法比较明文和加密后的密码是否匹配
            if (passwordEncoder.matches(pwd,resuser.getPwd()))
                return resuser;
        }
        return null;
    }

到此这篇关于SpringSecurity使用PasswordEncoder加密用户密码的示例代码的文章就介绍到这了,更多相关SpringSecurity PasswordEncoder加密密码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • Java全面细致讲解Wrapper的使用

    Java全面细致讲解Wrapper的使用

    在封装中有一种特殊的类,能够把基本的数据类型进行转换来方便实际的使用。我们在之前提到的一些数据类型,最明显的特征是所有字母为小写状态,那么经过Wrapper的包装后,首字母就变成了大写。下面我们就这种特殊的封装类Wrapper的使用
    2022-05-05
  • idea out目录与target目录的区别详解

    idea out目录与target目录的区别详解

    这篇文章主要介绍了idea out目录与target目录的区别详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Springboot单元测试编写实践

    Springboot单元测试编写实践

    在日常的开发过程中,为了提高代码的可靠性和健壮性,同时也是检测代码的质量,减少测试环节的问题,会对完成的业务功能代码编写单元测试,在本文中,将分享一些单元测试的实践和心得,需要的朋友可以参考下
    2023-11-11
  • Java语言的11大特点(Java初学者必知)

    Java语言的11大特点(Java初学者必知)

    Java是一种简单的,面向对象的,分布式的,解释型的,健壮安全的,结构中立的,可移植的,性能优异、多线程的静态语言。这篇文章主要介绍了Java语言的11大特点,需要的朋友可以参考下
    2020-07-07
  • 轻松掌握Java命令模式

    轻松掌握Java命令模式

    这篇文章主要帮助大家轻松掌握Java命令模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • spring boot与ktor整合的实现方法

    spring boot与ktor整合的实现方法

    这篇文章主要给大家介绍了关于spring boot与ktor整合的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java中的.concat()方法实例详解

    Java中的.concat()方法实例详解

    concat()方法用于将指定的字符串参数连接到字符串上,.concat()方法是一种连接两个字符串的简单方法,可以帮助我们在Java中处理字符串,对java .concat()方法用法感兴趣的朋友一起看看吧
    2024-01-01
  • Java反射技术详解

    Java反射技术详解

    这篇文章主要结合实例形式分析了介绍了Java反射技术,小编觉得这篇文章写的还不错,需要的朋友可以参考下,希望能够给你带来帮助
    2021-11-11
  • 深入理解mybatis的ParamNameResolver

    深入理解mybatis的ParamNameResolver

    ParamNameResolver是 MyBatis 中的一个重要组件,它为 MyBatis 提供了一种方便的方式来获取方法参数的名称,本文主要介绍了深入理解mybatis的ParamNameResolver,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • springboot实现执行sql语句打印到控制台

    springboot实现执行sql语句打印到控制台

    这篇文章主要介绍了springboot实现执行sql语句打印到控制台的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06

最新评论