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 加密用戶密碼
寫一個(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)的問題:
我在測(cè)試的時(shí)候報(bào)了MysglDataTruncation
錯(cuò)誤,提示Data truncation: Data too long for column 'pwd' at row 1
(如下圖),提示了密碼長(zhǎng)度過長(zhǎng)。
這是因?yàn)?數(shù)據(jù)庫(kù)中 pwd 字段長(zhǎng)度為 50,而BCryptPasswordEncoder生成的加密密碼長(zhǎng)度通常為 60 個(gè)字符的字符串,所以出現(xiàn)了長(zhǎng)度過長(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ì)此有興趣的朋友們可以參考下,希望能夠給你帶來幫助2021-11-11Java?Float?保留小數(shù)位精度的實(shí)現(xiàn)
這篇文章主要介紹了Java?Float?保留小數(shù)位精度的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12java中SpringBoot?自動(dòng)裝配的原理分析
這篇文章主要介紹了SpringBoot?自動(dòng)裝配的原理分析的相關(guān)資料,需要的朋友可以參考下2022-12-12spring boot如何使用AOP統(tǒng)一處理web請(qǐng)求
這篇文章主要介紹了spring boot如何使用AOP統(tǒng)一處理web請(qǐng)求,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12SpringBoot使用Mybatis注解實(shí)現(xiàn)分頁(yè)動(dòng)態(tài)sql開發(fā)教程
這篇文章主要為大家介紹了SpringBoot使用Mybatis注解實(shí)現(xiàn)分頁(yè)及動(dòng)態(tài)sql開發(fā)教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03mybatis的insert語(yǔ)句插入數(shù)據(jù)時(shí)的返回值的實(shí)現(xiàn)
這篇文章主要介紹了mybatis的insert語(yǔ)句插入數(shù)據(jù)時(shí)的返回值的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10SpringBoot中實(shí)現(xiàn)Druid前端監(jiān)控界面自動(dòng)登錄功能
這篇文章主要介紹了SpringBoot中實(shí)現(xiàn)Druid前端監(jiān)控界面自動(dòng)登錄功能,需要的朋友可以參考下2024-08-08