SpringSecurity使用PasswordEncoder加密用戶密碼的示例代碼
1. 導(dǎo)入依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2. 配置 PasswordEncoder
在配置類中創(chuàng)建一個(gè) PasswordEncoder 對(duì)象,并注入到 Spring 容器中。
@Configuration
public class SecurityConfig {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();// 加密方式
}
}
3. 使用 PasswordEncoder 加密用戶密碼
寫(xiě)一個(gè)Service 類,注入 PasswordEncoder 對(duì)象,在注冊(cè)用戶時(shí)對(duì)密碼進(jìn)行加密。
@Service
public class ResUserBizImpl implements ResUserBiz{
@Autowired
private ResUserMapper resUserMapper;
// 注入加密器
@Autowired
private PasswordEncoder passwordEncoder;
@Override
public int register(ResUserVO user) {
//需要先查詢是否已經(jīng)存在相同用戶名
// 創(chuàng)建條件構(gòu)造器
QueryWrapper<Resuser> queryWrapper = new QueryWrapper<>();
// 添加條件:用戶名
queryWrapper.eq("username", user.getUsername());
if (resUserMapper.selectOne(queryWrapper) != null) {
// 已經(jīng)存在相同用戶名
throw new RuntimeException("用戶名"+user.getUsername()+"已存在");
}
Resuser resuser = new Resuser();
resuser.setUsername(user.getUsername());
// 對(duì)密碼進(jìn)行加密
String encodedPassword = passwordEncoder.encode(user.getPwd());
System.out.println("加密后的密碼為:"+encodedPassword);
resuser.setPwd(encodedPassword);
resuser.setEmail(user.getEmail());
resUserMapper.insert(resuser);
return resuser.getUserid();
}
}
測(cè)試加密情況:

可能出現(xiàn)的問(wèn)題:
我在測(cè)試的時(shí)候報(bào)了MysglDataTruncation錯(cuò)誤,提示Data truncation: Data too long for column 'pwd' at row 1(如下圖),提示了密碼長(zhǎng)度過(guò)長(zhǎng)。
這是因?yàn)?數(shù)據(jù)庫(kù)中 pwd 字段長(zhǎng)度為 50,而B(niǎo)CryptPasswordEncoder生成的加密密碼長(zhǎng)度通常為 60 個(gè)字符的字符串,所以出現(xiàn)了長(zhǎng)度過(guò)長(zhǎng)的錯(cuò)誤。


解決:修改數(shù)據(jù)庫(kù)字段長(zhǎng)度。
ALTER TABLE your_table MODIFY COLUMN pwd VARCHAR(255);
4. 使用 PasswordEncoder 驗(yàn)證用戶密碼
在登錄時(shí),使用 PasswordEncoder 的matches("明文", "密文")對(duì)比用戶輸入的密碼和數(shù)據(jù)庫(kù)中存儲(chǔ)的加密后的密碼是否匹配。
@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;
}
到此這篇關(guān)于SpringSecurity使用PasswordEncoder加密用戶密碼的示例代碼的文章就介紹到這了,更多相關(guān)SpringSecurity PasswordEncoder加密密碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java Mybatis架構(gòu)設(shè)計(jì)深入了解
在本篇文章里小編給大家整理的是一篇關(guān)于Java Mybatis架構(gòu)設(shè)計(jì)詳解內(nèi)容,對(duì)此有興趣的朋友們可以參考下,希望能夠給你帶來(lái)幫助2021-11-11
Java?Float?保留小數(shù)位精度的實(shí)現(xiàn)
這篇文章主要介紹了Java?Float?保留小數(shù)位精度的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
java中SpringBoot?自動(dòng)裝配的原理分析
這篇文章主要介紹了SpringBoot?自動(dòng)裝配的原理分析的相關(guān)資料,需要的朋友可以參考下2022-12-12
spring boot如何使用AOP統(tǒng)一處理web請(qǐng)求
這篇文章主要介紹了spring boot如何使用AOP統(tǒng)一處理web請(qǐng)求,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
SpringBoot使用Mybatis注解實(shí)現(xiàn)分頁(yè)動(dòng)態(tài)sql開(kāi)發(fā)教程
這篇文章主要為大家介紹了SpringBoot使用Mybatis注解實(shí)現(xiàn)分頁(yè)及動(dòng)態(tài)sql開(kāi)發(fā)教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03
mybatis的insert語(yǔ)句插入數(shù)據(jù)時(shí)的返回值的實(shí)現(xiàn)
這篇文章主要介紹了mybatis的insert語(yǔ)句插入數(shù)據(jù)時(shí)的返回值的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
SpringBoot中實(shí)現(xiàn)Druid前端監(jiān)控界面自動(dòng)登錄功能
這篇文章主要介紹了SpringBoot中實(shí)現(xiàn)Druid前端監(jiān)控界面自動(dòng)登錄功能,需要的朋友可以參考下2024-08-08

