020-從零搭建微服務-認證中心(九)

寫在最前

如果這個項目讓你有所收獲,記得 Star 關注哦,這對我是非常不錯的鼓勵與支持。

源碼地址(后端):https://gitee.com/csps/mingyue

源碼地址(前端):https://gitee.com/csps/mingyue-ui

文檔地址:https://gitee.com/csps/mingyue/wikis

密碼加密

密碼加密是安全認證不可或缺的部分, Sa-Token在 v1.14 版本添加密碼加密模塊,該模塊非常簡單,僅僅封裝了一些常見的加密算法。

本系統將采用 BCrypt加密 加密方式對密碼加密!!!

摘要加密

md5、sha1、sha256

// md5加密 
SaSecureUtil.md5("123456");// sha1加密 
SaSecureUtil.sha1("123456");// sha256加密 
SaSecureUtil.sha256("123456");

對稱加密

AES加密

// 定義秘鑰和明文
String key = "123456";
String text = "Sa-Token 一個輕量級java權限認證框架";// 加密 
String ciphertext = SaSecureUtil.aesEncrypt(key, text);
System.out.println("AES加密后:" + ciphertext);// 解密 
String text2 = SaSecureUtil.aesDecrypt(key, ciphertext);
System.out.println("AES解密后:" + text2);

非對稱加密

RSA加密

// 定義私鑰和公鑰 
String privateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAO+wmt01pwm9lHMdq7A8gkEigk0XKMfjv+4IjAFhWCSiTeP7dtlnceFJbkWxvbc7Qo3fCOpwmfcskwUc3VSgyiJkNJDs9ivPbvlt8IU2bZ+PBDxYxSCJFrgouVOpAr8ar/b6gNuYTi1vt3FkGtSjACFb002/68RKUTye8/tdcVilAgMBAAECgYA1COmrSqTUJeuD8Su9ChZ0HROhxR8T45PjMmbwIz7ilDsR1+E7R4VOKPZKW4Kz2VvnklMhtJqMs4MwXWunvxAaUFzQTTg2Fu/WU8Y9ha14OaWZABfChMZlpkmpJW9arKmI22ZuxCEsFGxghTiJQ3tK8npj5IZq5vk+6mFHQ6aJAQJBAPghz91Dpuj+0bOUfOUmzi22obWCBncAD/0CqCLnJlpfOoa9bOcXSusGuSPuKy5KiGyblHMgKI6bq7gcM2DWrGUCQQD3SkOcmia2s/6i7DUEzMKaB0bkkX4Ela/xrfV+A3GzTPv9bIBamu0VIHznuiZbeNeyw7sVo4/GTItq/zn2QJdBAkEA8xHsVoyXTVeShaDIWJKTFyT5dJ1TR++/udKIcuiNIap34tZdgGPI+EM1yoTduBM7YWlnGwA9urW0mj7F9e9WIQJAFjxqSfmeg40512KP/ed/lCQVXtYqU7U2BfBTg8pBfhLtEcOg4wTNTroGITwe2NjL5HovJ2n2sqkNXEio6Ji0QQJAFLW1Kt80qypMqot+mHhS+0KfdOpaKeMWMSR4Ij5VfE63WzETEeWAMQESxzhavN1WOTb3/p6icgcVbgPQBaWhGg==";
String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDvsJrdNacJvZRzHauwPIJBIoJNFyjH47/uCIwBYVgkok3j+3bZZ3HhSW5Fsb23O0KN3wjqcJn3LJMFHN1UoMoiZDSQ7PYrz275bfCFNm2fjwQ8WMUgiRa4KLlTqQK/Gq/2+oDbmE4tb7dxZBrUowAhW9NNv+vESlE8nvP7XXFYpQIDAQAB";// 文本
String text = "Sa-Token 一個輕量級java權限認證框架";// 使用公鑰加密
String ciphertext = SaSecureUtil.rsaEncryptByPublic(publicKey, text);
System.out.println("公鑰加密后:" + ciphertext);// 使用私鑰解密
String text2 = SaSecureUtil.rsaDecryptByPrivate(privateKey, ciphertext);
System.out.println("私鑰解密后:" + text2); 

私鑰和公鑰調用以下方法生成即可

// 生成一對公鑰和私鑰,其中Map對象 (private=私鑰, public=公鑰)
System.out.println(SaSecureUtil.rsaGenerateKeyPair());

Base64編碼與解碼

// 文本
String text = "Sa-Token 一個輕量級java權限認證框架";// 使用Base64編碼
String base64Text = SaBase64Util.encode(text);
System.out.println("Base64編碼后:" + base64Text);// 使用Base64解碼
String text2 = SaBase64Util.decode(base64Text);
System.out.println("Base64解碼后:" + text2); 

BCrypt加密

由它加密的文件可在所有支持的操作系統和處理器上進行轉移

// 使用方法
String pw_hash = BCrypt.hashpw(plain_password, BCrypt.gensalt()); // 使用checkpw方法檢查被加密的字符串是否與原始字符串匹配:
BCrypt.checkpw(candidate_password, stored_hash); // gensalt方法提供了可選參數 (log_rounds) 來定義加鹽多少,也決定了加密的復雜度:
String strong_salt = BCrypt.gensalt(10);
String stronger_salt = BCrypt.gensalt(12); 

密文登錄

1. 明文密碼生成密文

// 生成加密鹽
String gensalt = BCrypt.gensalt();String pw_hash = BCrypt.hashpw("123456", gensalt); // 打印加密后的密文
System.out.println(pw_hash);
// $2a$12$pBVti6NTcVJxptxHNqetBewxqwJU54.sItx3b8U2Kl44XnQinfUHq

2. 生成加密鹽放入 Nacos

mingyue-auth.yml

# 用戶配置
user:password:# 私鑰salt: $2a$12$pBVti6NTcVJxptxHNqetBe

用戶密碼配置類

@Data
@Configuration
@RefreshScope
@ConfigurationProperties(prefix = "user.password")
public class UserPasswordProperties {/*** 密碼加鹽*/private String salt;}

3. 修改數據庫用戶密碼

INSERT INTO `sys_user` VALUES (1, 'mingyue', '明月', '0', '$2a$12$pBVti6NTcVJxptxHNqetBewxqwJU54.sItx3b8U2Kl44XnQinfUHq', '13288888888', NULL, NULL, '0', '0', '2023-07-19 17:06:22', '2023-07-19 17:06:25', 'mingyue', 'mingyue');
INSERT INTO `sys_user` VALUES (2, 'strive', 'Strive', '0', '$2a$12$pBVti6NTcVJxptxHNqetBewxqwJU54.sItx3b8U2Kl44XnQinfUHq', '15388888888', NULL, NULL, '0', '0', '2023-07-19 17:06:22', '2023-07-19 17:06:25', 'mingyue', 'mingyue');

4. 修改登錄密碼校驗

public SaTokenInfo login(PasswordLoginDto dto) {// 遠程調用用戶服務R<LoginUser> userInfoResp = remoteUserService.userInfo(dto.getUsername());if (Objects.isNull(userInfoResp) || Objects.isNull(userInfoResp.getData())) {return null;}LoginUser userInfo = userInfoResp.getData();// 登錄密碼校驗if (!userInfo.getPassword().equals(dto.getPassword())) {throw new UserException("密碼錯誤,請重試!");}if (dto.getUsername().equals(userInfo.getUsername()) && dto.getPassword().equals(userInfo.getPassword())) {// 第1步,先登錄上LoginHelper.login(userInfo);// 第2步,獲取 Token 相關參數SaTokenInfo tokenInfo = StpUtil.getTokenInfo();return tokenInfo;}return null;}

5.啟動測試

5.1. 明文測試

curl -X 'POST' \'http://mingyue-gateway:9100/auth/login' \-H 'accept: */*' \-H 'Content-Type: application/json' \-d '{"username": "mingyue","password": "123456"
}'

測試結果

{"code": 500,"msg": "密碼錯誤,請重試!","data": null
}

5.2. 密文測試

curl -X 'POST' \'http://mingyue-gateway:9100/auth/login' \-H 'accept: */*' \-H 'Content-Type: application/json' \-d '{"username": "mingyue","password": "$2a$12$pBVti6NTcVJxptxHNqetBewxqwJU54.sItx3b8U2Kl44XnQinfUHq"
}'

測試結果

{"code": 200,"msg": "登錄成功","data": "nHefN9Z9t3bptgQ5CI3nMMqPuCEOS03n"
}

MingYue-UI登錄修改

明文轉密文

state.ruleForm.password = bcryptjs.hashSync(state.ruleForm.password, state.salt);

const onSignIn = async () => {state.loading.signIn = true;state.ruleForm.password = bcryptjs.hashSync(state.ruleForm.password, state.salt);useLoginApi().signIn(state.ruleForm).then(async res => {// 存儲 token 到瀏覽器緩存Session.set('token', res.data);// 模擬數據,對接接口時,記得刪除多余代碼及對應依賴的引入。用于 `/src/stores/userInfo.ts` 中不同用戶登錄判斷(模擬數據)Cookies.set('username', state.ruleForm.username);if (!themeConfig.value.isRequestRoutes) {// 前端控制路由,2、請注意執行順序const isNoPower = await initFrontEndControlRoutes();signInSuccess(isNoPower);} else {// 模擬后端控制路由,isRequestRoutes 為 true,則開啟后端控制路由// 添加完動態路由,再進行 router 跳轉,否則可能報錯 No match found for location with path "/"const isNoPower = await initBackEndControlRoutes();// 執行完 initBackEndControlRoutes,再執行 signInSuccesssignInSuccess(isNoPower);}});};

小結

現在終于不是明文登錄啦~

目前 mingyue-ui 的登錄驗證碼還是固定的,接下來,我們需要把驗證碼用上,沖!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/42859.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42859.shtml
英文地址,請注明出處:http://en.pswp.cn/news/42859.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【C#】條碼管理操作手冊

前言&#xff1a;本文檔為條碼管理系統操作指南&#xff0c;介紹功能使用、參數配置、資源鏈接&#xff0c;以及異常的解決等。思維導圖如下&#xff1a; 一、思維導圖 二、功能操作–條碼打印&#xff08;客戶端&#xff09; 2.1 參數設置 功能介紹&#xff1a;二維碼圖片樣…

Windows定時任務計劃無法顯示任務程序界面的問題解決

筆者這兩天寫了一個python腳本程序&#xff0c;用來自動從公司的主數據系統獲取數據&#xff0c;并按格式編制成excel。腳本程序編寫一切順利&#xff0c;運行結果很是完美&#xff0c;筆者很是舒心。但在最后一步&#xff0c;用上班的電腦每天早上定時運行它時&#xff0c;出了…

JAVA設計模式總結之23種設計模式

一、什么是設計模式 設計模式&#xff08;Design pattern&#xff09;是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計…

【Git】Git中的鉤子

Git Book——Git的自定義鉤子 Git中的鉤子分為兩大類&#xff1a; 1、客戶端鉤子&#xff1a;由諸如提交和合并這樣的操作所調用 2、服務端鉤子&#xff1a;由諸如接收被推送的提交這樣的聯網操作 客戶端鉤子&#xff1a; 提交工作流鉤子 pre-commit&#xff1a;在提交信息前…

ahooks.js:一款強大的React Hooks庫及其API使用教程(三)

一、ahooks.js簡介二、ahooks.js安裝三、繼續ahooks.js API的介紹與使用教程41. useAsyncEffect42. useDebounceEffect43. useDebounceFn44. useThrottleFn45. useThrottleEffect46. useDeepCompareEffect47. usePrevious48. useRafState49. useSafeState50. useGetState 一、a…

開源和自研——機器人

雙足機器人&#xff1a; MPC技術&#xff1a;封閉性非常高。沒有開源方案可抄。 因為開源&#xff0c;不需要從0構建。 這也是前兩年&#xff0c;國外一開源華為就遙遙領先。 射頻芯片/射頻天線&#xff1a;技術封閉。華為雖然做通信&#xff0c;但卻沒有攻破。 鴻蒙&#…

計算復雜度基礎

1. 抽象問題 抽象問題包括決策問題和優化問題 注意&#xff1a;描述中&#xff0c;I的縮寫是Instance&#xff0c;S的縮寫是Solution。 2. 決策問題 3. 優化問題 將一個優化問題轉換為決策問題后&#xff0c;不會變的更難。 \color {green}將一個優化問題轉換為決策問題后&…

【C++】int a;和int *p=new int;有什么區別?

2023年8月19日&#xff0c;周六早上 int a; 和 int *p new int; 之間有以下區別&#xff1a; 1. 內存分配方式&#xff1a;int a; 是在棧上分配內存&#xff0c;而 int *p new int; 是在堆上動態分配內存。 2. 生命周期&#xff1a;int a; 的生命周期與其所在的作用域相同&…

Python繪圖系統6:自定義坐標列表控件

文章目錄 自定義坐標列表控件顯示和隱藏加載按鈕坐標設置控件的顯示和隱藏源代碼 Python繪圖系統&#xff1a; 基礎&#xff1a;將matplotlib嵌入到tkinter &#x1f4c8;簡單的繪圖系統 &#x1f4c8;數據導入&#x1f4c8;三維繪圖系統自定義控件&#xff1a;坐標設置控件&a…

【Spring Boot】JdbcTemplate數據連接模板 — JdbcTemplate入門

JdbcTemplate入門 本節從基礎的部分開始介紹什么是JDBC、什么是JdbcTemplate&#xff0c;然后介紹Spring Boot項目如何使用JdbcTemplate操作數據庫。 1.JdbcTemplate簡介 1.1 什么是JDBC JDBC&#xff08;Java Data Base Connectivity&#xff0c;Java數據庫連接&#xff0…

【二叉樹】100. 相同的樹

100. 相同的樹 解題思路 深度優先遍歷首先寫的就是遞歸結束條件當兩個節點都是null 直接返回true當只有其中一個節點是null 返回false當兩個節點的值不相等的時候 直接false然后兩棵樹的左節點 兩個樹的右節點 /*** Definition for a binary tree node.* public class TreeN…

android resoure資源圖片顏色值錯亂

最近androidstudio開發&#xff0c;添加一些顏色值或者drawable資源文件時&#xff0c;運行app,顏色值或者圖片對應不上&#xff0c;暫時找不到原因&#xff0c;望告知。 暫時解決方法&#xff1a;

鏈游再進化 Web3版CSGO來襲

過去幾年&#xff0c;游戲開發者們一直希望借Web3這個價值流通網絡&#xff0c;改造傳統游戲的經濟系統&#xff0c;將虛擬資產的掌管權交給用戶&#xff0c;讓資產自由地在市場流通。 Web3游戲發展史上&#xff0c;涌現過CryptoKitties、Axie Infinity兩大爆款&#xff0c;但…

【C++深入淺出】初識C++中篇(引用、內聯函數)

目錄 一. 前言 二. 引用 2.1 引用的概念 2.2 引用的使用 2.3 引用的特性 2.4 常引用 2.5 引用的使用場景 2.6 傳值、傳引用效率比較 2.7 引用和指針的區別 三. 內聯函數 3.1 內聯函數的概念 3.2 內聯函數的特性 一. 前言 上期說道&#xff0c;C是在C的基礎之上&…

onvif中imaging setting圖像畫質總結!

前言&#xff1a; 大家好&#xff0c;今天給大家來分享一篇關于圖像質量的內容&#xff0c;這個內容是我在做onvif中的imaging setting的時候&#xff0c;關注到里面有關于: brightness(亮度)color saturation(色彩飽和度)contrast(對比度)sharpness(銳度)white balance(白平衡…

C語言刷題指南(二)

&#x1f4d9;作者簡介&#xff1a; 清水加冰&#xff0c;目前大二在讀&#xff0c;正在學習C/C、Python、操作系統、數據庫等。 &#x1f4d8;相關專欄&#xff1a;C語言初階、C語言進階、C語言刷題訓練營、數據結構刷題訓練營、有感興趣的可以看一看。 歡迎點贊 &#x1f44d…

TDI(Time Delay Integration)

TDI&#xff08;Time Delay Integration&#xff09;是一種特殊的圖像采集技術&#xff0c;常用于線陣CCD&#xff08;Charge-Coupled Device&#xff09;相機。TDI技術可以在保持高分辨率的同時增強圖像的信噪比&#xff08;Signal-to-Noise Ratio, SNR&#xff09;&#xff0…

kubesphere 集成 sonar

文章目錄 安裝 helm通過 helm 安裝 sonar配置 SonarQube 服務器創建 SonarQube 管理員令牌SonarQube 配置添加到 ks-installer創建 Webhook 服務器將 SonarQube 服務器添加至 Jenkins將 sonarqubeURL 添加到 KubeSphere 控制臺重啟服務 為新項目創建 SonarQube Token 官方文檔&…

Threejs學習04——球緩沖幾何體環境光以及直線光源

實現隨機多個三角形隨機位置隨機顏色展示效果 這是一個非常簡單基礎的threejs的學習應用&#xff01;本節主要學習的是球面緩沖幾何體在環境光合直線光源下的效果&#xff0c;可以學習到環境光和直線光源的生成效果等功能&#xff01;主要使用的是球緩沖幾何體對象SphereGeome…

使用el-tree實現自定義樹結構樣式

實現效果: 直接上代碼: <template><div><div class"tops"><el-tree :default-expanded-keys"[1]" ref"myTree" :data"data" :props"defaultProps" node-click"handleNodeClick" highlight…