国产香港一级毛片在线看_人人看人人爽91视频_99久久er这里只有精品17_国产日产欧美a一级在线

您的位置:首頁>新聞 > 數據 >

對敏感操作的二次認證 —— 詳解 Sa-Token 二級認證

2023-07-06 05:20:04    來源:博客園
一、需求分析

在某些敏感操作下,我們需要對已登錄的會話進行二次驗證。


(相關資料圖)

比如代碼托管平臺的倉庫刪除操作,盡管我們已經登錄了賬號,當我們點擊 [刪除]按鈕時,還是需要再次輸入一遍密碼,這么做主要為了兩點:

保證操作者是當前賬號本人。增加操作步驟,防止誤刪除重要數據。

這就是我們本篇要講的 —— 二級認證,即:在已登錄會話的基礎上,進行再次驗證,提高會話的安全性。

Sa-Token 是一個輕量級 java 權限認證框架,主要解決登錄認證、權限認證、單點登錄、OAuth2、微服務網關鑒權 等一系列權限相關問題。Gitee 開源地址:https://gitee.com/dromara/sa-token

本文將介紹在 SpringBoot 架構下,如何使用 Sa-Token 完成二級認證操作。

首先在項目中引入 Sa-Token 依賴:

    cn.dev33    sa-token-spring-boot-starter    1.34.0

注:如果你使用的是 SpringBoot 3.x,只需要將 sa-token-spring-boot-starter修改為 sa-token-spring-boot3-starter即可。

二、具體API

Sa-Token中進行二級認證非常簡單,只需要使用以下API:

// 在當前會話 開啟二級認證,時間為120秒StpUtil.openSafe(120); // 獲?。寒斍皶捠欠裉幱诙壵J證時間內StpUtil.isSafe(); // 檢查當前會話是否已通過二級認證,如未通過則拋出異常StpUtil.checkSafe(); // 獲取當前會話的二級認證剩余有效時間 (單位: 秒, 返回-2代表尚未通過二級認證)StpUtil.getSafeTime(); // 在當前會話 結束二級認證StpUtil.closeSafe(); 
三、一個小示例

一個完整的二級認證業務流程,應該大致如下:

package com.pj.cases.up;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import cn.dev33.satoken.stp.StpUtil;import cn.dev33.satoken.util.SaResult;/** * Sa-Token 二級認證示例  *  * @author kong * @since 2022-10-16  */@RestController@RequestMapping("/safe/")public class SafeAuthController {// 刪除倉庫    ---- http://localhost:8081/safe/deleteProject@RequestMapping("deleteProject")public SaResult deleteProject(String projectId) {    // 第1步,先檢查當前會話是否已完成二級認證 // 這個地方既可以通過 StpUtil.isSafe() 手動判斷,// 也可以通過 StpUtil.checkSafe() 或者 @SaCheckSafe 來校驗(校驗不通過時將拋出 NotSafeException 異常)    if(!StpUtil.isSafe()) {        return SaResult.error("倉庫刪除失敗,請完成二級認證后再次訪問接口");    }    // 第2步,如果已完成二級認證,則開始執行業務邏輯    // ...     // 第3步,返回結果     return SaResult.ok("倉庫刪除成功"); }// 提供密碼進行二級認證    ---- http://localhost:8081/safe/openSafe?password=123456@RequestMapping("openSafe")public SaResult openSafe(String password) {    // 比對密碼(此處只是舉例,真實項目時可拿其它參數進行校驗)    if("123456".equals(password)) {        // 比對成功,為當前會話打開二級認證,有效期為120秒,意為在120秒內再調用 deleteProject 接口都無需提供密碼         StpUtil.openSafe(120);        return SaResult.ok("二級認證成功");    }    // 如果密碼校驗失敗,則二級認證也會失敗    return SaResult.error("二級認證失敗"); }// 手動關閉二級認證    ---- http://localhost:8081/safe/closeSafe@RequestMapping("closeSafe")public SaResult closeSafe() {StpUtil.closeSafe();    return SaResult.ok();}}

全局異常攔截器,統一返回給前端的格式,參考:

@RestControllerAdvicepublic class GlobalExceptionHandler {    // 全局異常攔截     @ExceptionHandler    public SaResult handlerException(Exception e) {        e.printStackTrace();         return SaResult.error(e.getMessage());    }}

前提:二級認證時我們必須處于登錄狀態(可參考之前的登錄認證章節代碼),完成登錄后,調用接口進行二級認證校驗:

前端調用 deleteProject 接口,嘗試刪除倉庫。 ---- http://localhost:8081/safe/deleteProject后端校驗會話尚未完成二級認證,返回: 倉庫刪除失敗,請完成二級認證后再次訪問接口。前端將信息提示給用戶,用戶輸入密碼,調用 openSafe 接口。 ---- http://localhost:8081/safe/openSafe?password=123456后端比對用戶輸入的密碼,完成二級認證,有效期為:120秒。前端在 120 秒內再次調用 deleteProject 接口,嘗試刪除倉庫。 ---- http://localhost:8081/safe/deleteProject后端校驗會話已完成二級認證,返回:倉庫刪除成功。四、指定業務標識進行二級認證

如果項目有多條業務線都需要敏感操作驗證,則 StpUtil.openSafe()無法提供細粒度的認證操作,此時我們可以指定一個業務標識來分辨不同的業務線:

// 在當前會話 開啟二級認證,業務標識為client,時間為600秒StpUtil.openSafe("client", 600); // 獲?。寒斍皶捠欠褚淹瓿芍付I務的二級認證 StpUtil.isSafe("client"); // 校驗:當前會話是否已完成指定業務的二級認證 ,如未認證則拋出異常StpUtil.checkSafe("client"); // 獲取當前會話指定業務二級認證剩余有效時間 (單位: 秒, 返回-2代表尚未通過二級認證)StpUtil.getSafeTime("client"); // 在當前會話 結束指定業務標識的二級認證StpUtil.closeSafe("client"); 

業務標識可以填寫任意字符串,不同業務標識之間的認證互不影響,比如:

// 打開了業務標識為 client 的二級認證 StpUtil.openSafe("client"); // 判斷是否處于 shop 的二級認證,會返回 false StpUtil.isSafe("shop");  // 返回 false // 也不會通過校驗,會拋出異常 StpUtil.checkSafe("shop"); 

代碼示例:

package com.pj.cases.up;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import cn.dev33.satoken.stp.StpUtil;import cn.dev33.satoken.util.SaResult;/** * Sa-Token 二級認證示例  *  * @author kong * @since 2022-10-16  */@RestController@RequestMapping("/safe/")public class SafeAuthController {// ------------------ 指定業務類型進行二級認證 // 獲取應用秘鑰    ---- http://localhost:8081/safe/getClientSecret@RequestMapping("getClientSecret")public SaResult getClientSecret() {    // 第1步,先檢查當前會話是否已完成 client業務 的二級認證 StpUtil.checkSafe("client");    // 第2步,如果已完成二級認證,則返回數據     return SaResult.data("aaaa-bbbb-cccc-dddd-eeee");}// 提供手勢密碼進行二級認證    ---- http://localhost:8081/safe/openClientSafe?gesture=35789@RequestMapping("openClientSafe")public SaResult openClientSafe(String gesture) {    // 比對手勢密碼(此處只是舉例,真實項目時可拿其它參數進行校驗)    if("35789".equals(gesture)) {        // 比對成功,為當前會話打開二級認證:    // 業務類型為:client     // 有效期為600秒==10分鐘,意為在10分鐘內,調用 getClientSecret 時都無需再提供手勢密碼         StpUtil.openSafe("client", 600);        return SaResult.ok("二級認證成功");    }    // 如果密碼校驗失敗,則二級認證也會失敗    return SaResult.error("二級認證失敗"); }// 查詢當前會話是否已完成指定的二級認證    ---- http://localhost:8081/safe/isClientSafe@RequestMapping("isClientSafe")public SaResult isClientSafe() {    return SaResult.ok("當前是否已完成 client 二級認證:" + StpUtil.isSafe("client")); }}
五、使用注解進行二級認證

在一個方法上使用 @SaCheckSafe注解,可以在代碼進入此方法之前進行一次二級認證校驗

// 二級認證:必須二級認證之后才能進入該方法 @SaCheckSafe      @RequestMapping("add")public String add() {    return "用戶增加";}// 指定業務類型,進行二級認證校驗@SaCheckSafe("art")@RequestMapping("add2")public String add2() {    return "文章增加";}

標注 @SaCheckSafe的方法必須在二級認證后才能訪問成功,其效果與代碼 StpUtil.checkSafe()等同。

參考資料Sa-Token 文檔:https://sa-token.ccGitee 倉庫地址:https://gitee.com/dromara/sa-tokenGitHub 倉庫地址:https://github.com/dromara/sa-token

關鍵詞:

相關閱讀

国产香港一级毛片在线看_人人看人人爽91视频_99久久er这里只有精品17_国产日产欧美a一级在线

      在线成人免费观看| 一区二区在线看| 午夜亚洲福利老司机| 国产成人精品免费一区二区| 国产精品久久久久aaaa樱花 | 亚洲无线码一区二区三区| 韩国av一区二区三区四区| 中文字幕免费在线观看视频一区| 图片区小说区国产精品视频| www欧美成人18+| 亚洲成在人线在线播放| 成人精品免费视频| 亚洲妇女屁股眼交7| 久久久久综合网| 日本欧美加勒比视频| 国产校园另类小说区| 在线观看日韩一区| 中文字幕一区视频| 国产精品一二一区| 亚洲欧美偷拍卡通变态| 欧美成人免费网站| 亚洲成人精品影院| 久久久三级国产网站| 欧美三级资源在线| 亚洲激情五月婷婷| 972aa.com艺术欧美| 色偷偷久久一区二区三区| 中文字幕二三区不卡| 狠狠狠色丁香婷婷综合久久五月| 国产精品久久久久一区二区三区| 欧美福利一区二区| 午夜精品一区二区三区三上悠亚| 久久久久久久电影| 6080日韩午夜伦伦午夜伦| 一区二区久久久久| 久久久精品tv| 欧美日韩激情一区| 亚洲国产成人av好男人在线观看| 久久影音资源网| 欧美日韩成人综合天天影院| 亚洲国产精品久久久男人的天堂 | 欧美精品一区二区久久久| 男女激情视频一区| 中文字幕一区三区| 精品国产欧美一区二区| 久久99国产乱子伦精品免费| 亚洲免费三区一区二区| 国产偷国产偷亚洲高清人白洁| 极品少妇一区二区| 亚洲国产综合在线| 亚洲日本在线观看| 久久免费看少妇高潮| 日韩视频免费观看高清完整版 | 2023国产精品视频| 国产自产视频一区二区三区| 亚洲一区成人在线| 成人免费视频在线观看| 91美女蜜桃在线| 91精品国产综合久久久久久久 | 一区二区不卡在线视频 午夜欧美不卡在 | 欧美日韩国产一二三| 午夜激情综合网| ●精品国产综合乱码久久久久| 久久久久久97三级| 成人a级免费电影| 欧美理论片在线| 久久精品久久综合| 亚洲成在人线在线播放| 亚洲精选视频免费看| 久久亚洲捆绑美女| 精品国产乱码久久久久久久| 国产一区二区三区在线看麻豆| 婷婷激情综合网| 亚洲va在线va天堂| 亚洲伦理在线精品| 亚洲欧美日韩中文播放| 中文字幕第一区第二区| 亚洲国产精品精华液ab| 91碰在线视频| 久久亚洲二区三区| caoporm超碰国产精品| 欧美一区二区三区视频| 国产一区二区三区精品欧美日韩一区二区三区| 色综合中文字幕| 天堂成人国产精品一区| 亚洲国产欧美日韩另类综合 | 亚洲一区二区三区激情| 亚洲国产视频网站| 亚洲精品中文字幕在线观看| 亚洲精品国产一区二区精华液| 国产精品国产三级国产普通话三级| 欧美国产视频在线| 国产亚洲欧美一区在线观看| 久久精品亚洲乱码伦伦中文| 91片在线免费观看| 国产色产综合色产在线视频| 国产亚洲女人久久久久毛片| 国产色婷婷亚洲99精品小说| 国产日韩综合av| 中文一区在线播放| 国产精品欧美一级免费| ...中文天堂在线一区| 中文字幕中文字幕一区| 亚洲欧美电影一区二区| 亚洲精品免费在线播放| 亚洲高清一区二区三区| 午夜精品福利一区二区三区蜜桃| 日韩av二区在线播放| 在线免费观看日韩欧美| 国产乱人伦精品一区二区在线观看| 欧美剧在线免费观看网站| 国产成人一级电影| 日韩精品一区二区三区在线播放| 99在线精品观看| 国产三级一区二区| 国产精品短视频| 亚洲午夜激情av| 色婷婷综合久色| 国产精品456| 精品福利一区二区三区| 久久久久久毛片| 亚洲六月丁香色婷婷综合久久 | 首页国产欧美久久| 欧美视频在线不卡| 丁香婷婷综合激情五月色| 久久久久久9999| 亚洲视频 欧洲视频| 午夜精品影院在线观看| 精品婷婷伊人一区三区三| 成人深夜福利app| 欧美极品少妇xxxxⅹ高跟鞋| 亚洲欧洲另类国产综合| 日韩精品成人一区二区在线| 欧美日韩五月天| 91玉足脚交白嫩脚丫在线播放| 中文字幕一区二区三区乱码在线| 亚洲影视资源网| 国产一区二区福利| 久久久久青草大香线综合精品| 国产精品美女久久久久久久| 午夜精品久久久久久久久| 欧美精品第一页| 久久久精品蜜桃| 亚洲一区二区三区影院| 欧美视频一二三区| 91麻豆文化传媒在线观看| 亚洲精品视频在线看| 欧洲激情一区二区| 99re视频这里只有精品| 亚洲欧洲中文日韩久久av乱码| 亚洲高清免费一级二级三级| 国产精品一二三| 国产精品免费人成网站| 亚洲国产va精品久久久不卡综合| 国产精品资源站在线| 国产精品久久久久久久久搜平片| 亚洲国产色一区| 成人中文字幕电影| 亚洲欧美经典视频| 欧美日韩精品二区第二页| 国产日韩三级在线| 肉色丝袜一区二区| 欧美精品一区二区三区高清aⅴ| 亚洲免费资源在线播放| 国产精品性做久久久久久| 中文字幕一区日韩精品欧美| 色94色欧美sute亚洲线路二 | 亚洲乱码日产精品bd| 欧美日韩一级片网站| 久久精品一区八戒影视| 日本欧美大码aⅴ在线播放| 久久蜜桃av一区精品变态类天堂| 一区二区三区在线不卡| 国产精品 日产精品 欧美精品| 中文字幕一区二区三区视频| 在线免费一区三区| 国产欧美日韩综合| 美腿丝袜亚洲一区| 欧美国产日韩在线观看| 日本道免费精品一区二区三区| 久久综合久久鬼色中文字| 日本欧美一区二区三区乱码 | 日韩欧美一区二区视频| 亚洲精品免费在线观看| 成人一区二区三区视频在线观看| 亚洲精品乱码久久久久久 | 国产精品久久久久精k8| 欧美午夜免费电影| 中文字幕在线不卡视频| 国产不卡视频在线观看| 一二三四区精品视频| 精品久久久网站| 天天综合日日夜夜精品| 久久久国产午夜精品| 久久99国产精品免费| 亚洲乱码日产精品bd| 欧美不卡一区二区| 亚洲成人av一区| 国产日本欧美一区二区| 国产另类ts人妖一区二区|