【springsecurity】使用PasswordEncoder加密用户密码

目录

  • [1. 导入依赖](#1. 导入依赖)
  • [2. 配置 PasswordEncoder](#2. 配置 PasswordEncoder)
  • [3. 使用 PasswordEncoder 加密用户密码](#3. 使用 PasswordEncoder 加密用户密码)
  • [4. 使用 PasswordEncoder 验证用户密码](#4. 使用 PasswordEncoder 验证用户密码)

1. 导入依赖

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

2. 配置 PasswordEncoder

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

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

3. 使用 PasswordEncoder 加密用户密码

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

java 复制代码
@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 个字符的字符串,所以出现了长度过长的错误。

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

sql 复制代码
ALTER TABLE your_table MODIFY COLUMN pwd VARCHAR(255);

4. 使用 PasswordEncoder 验证用户密码

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

java 复制代码
    @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;
    }

参考链接:

spring security 官方文档:https://docs.spring.io/spring-security/reference/index.html

spring security 中文文档:https://springdoc.cn/spring-security/index.html

参考博客:https://blog.csdn.net/m0_71273766/article/details/132942056?spm=1001.2014.3001.5501

相关推荐
Kyrie_Li7 小时前
Spring Boot Kafka 生产级配置全解析:从入门到精通
spring boot·后端·kafka
无心水10 小时前
【全域智能营销实战】2、Spring AI 模块化架构深度解读:从 1.0 到 2.0 的演进与最佳实践
人工智能·spring·架构·harness·顶尖架构师·全域智能营销·harmess
livemetee15 小时前
【关于Spring声明式事务】
java·后端·spring
小强库计算机毕业设计17 小时前
源码分享Spring Boot + Vue3 的校园社团管理系统
java·spring boot·后端·计算机毕业设计
Esaka_Forever17 小时前
Python 完整内存管理机制详解
开发语言·python·spring
格子软件17 小时前
2026年分布式GEO代理流量调度:源码级状态机防重挂实战
java·vue.js·人工智能·spring boot·分布式·vue
万亿少女的梦16817 小时前
基于Spring Boot的天空影院电影网站系统设计与实现
java·spring boot·mysql·vue·系统设计
万亿少女的梦16817 小时前
基于Spring Boot的社区管理系统设计与实现
java·spring boot·mysql·vue·系统设计
殳翰17 小时前
spring对junit的支持
spring·junit·sqlserver