自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

從零搭建開發(fā)腳手架 集成認(rèn)證授權(quán) Sa-Token(嘗鮮)

開發(fā) 后端
目前我僅以學(xué)習(xí)和嘗鮮為目的來(lái)集成,不建議用于公司等正式環(huán)境,公司還是建議Shiro和Spring Security那一套。(等我實(shí)戰(zhàn)一波看看效果再說(shuō))

 [[392885]]

本文轉(zhuǎn)載自微信公眾號(hào)「Java大廠面試官」,作者laker。轉(zhuǎn)載本文請(qǐng)聯(lián)系Java大廠面試官公眾號(hào)。

目前我僅以學(xué)習(xí)和嘗鮮為目的來(lái)集成,不建議用于公司等正式環(huán)境,公司還是建議Shiro和Spring Security那一套。(等我實(shí)戰(zhàn)一波看看效果再說(shuō))

為什么要嘗鮮Sa-Token

之前我還是挺排斥國(guó)產(chǎn)小作坊的開源作品,畢竟不是根紅苗正,但是隨著近幾年國(guó)內(nèi)開源社區(qū)的大力發(fā)展,以及在平時(shí)工作中又接觸了解很多,慢慢改變了我的看法,其實(shí)國(guó)人開源作品還是很香的,其Api簡(jiǎn)單易用,源碼和官方文檔都是中文的,功能豐富且能滿足很多中國(guó)式需求,各種QQ、微信交流群活躍度非常高,總之就是極大程度滿足中國(guó)式需求。

在權(quán)限認(rèn)證框架領(lǐng)域,使用最多的莫過(guò)于Shiro和Spring Security,但是一天在逛同性交友網(wǎng)站(github)的時(shí)候,赫然發(fā)現(xiàn)了Sa-Token其竟然有2K的star數(shù)量,看其中文介紹竟然是輕量級(jí)Java權(quán)限認(rèn)證框架,看了下其特性和功能點(diǎn),就喚起了我強(qiáng)烈的好奇心,于是乎就有了今天的嘗鮮。

Sa-Token是什么?

sa-token是一個(gè)輕量級(jí)Java權(quán)限認(rèn)證框架,主要解決:登錄認(rèn)證、權(quán)限認(rèn)證、Session會(huì)話、單點(diǎn)登錄、OAuth2.0 等一系列權(quán)限相關(guān)問(wèn)題

框架針對(duì)踢人下線、自動(dòng)續(xù)簽、前后臺(tái)分離、分布式會(huì)話……等常見業(yè)務(wù)進(jìn)行N多適配,通過(guò)sa-token,你可以以一種極簡(jiǎn)的方式實(shí)現(xiàn)系統(tǒng)的權(quán)限認(rèn)證部分

與其它權(quán)限認(rèn)證框架相比,sa-token 具有以下優(yōu)勢(shì):

  • 簡(jiǎn)單 :可零配置啟動(dòng)框架,真正的開箱即用,低成本上手
  • 強(qiáng)大 :目前已集成幾十項(xiàng)權(quán)限相關(guān)特性,涵蓋了大部分業(yè)務(wù)場(chǎng)景的解決方案
  • 易用 :如絲般順滑的API調(diào)用,大量高級(jí)特性統(tǒng)統(tǒng)只需一行代碼即可實(shí)現(xiàn)
  • 高擴(kuò)展 :幾乎所有組件都提供了擴(kuò)展接口,90%以上的邏輯都可以按需重寫

Sa-Token 能做什么?

  • 登錄驗(yàn)證 —— 輕松登錄鑒權(quán),并提供五種細(xì)分場(chǎng)景值
  • 權(quán)限驗(yàn)證 —— 適配RBAC權(quán)限模型,不同角色不同授權(quán)
  • Session會(huì)話 —— 專業(yè)的數(shù)據(jù)緩存中心
  • 踢人下線 —— 將違規(guī)用戶立刻清退下線
  • 持久層擴(kuò)展 —— 可集成Redis、Memcached等專業(yè)緩存中間件,重啟數(shù)據(jù)不丟失
  • 分布式會(huì)話 —— 提供jwt集成和共享數(shù)據(jù)中心兩種分布式會(huì)話方案
  • 單點(diǎn)登錄 —— 一處登錄,處處通行
  • 模擬他人賬號(hào) —— 實(shí)時(shí)操作任意用戶狀態(tài)數(shù)據(jù)
  • 臨時(shí)身份切換 —— 將會(huì)話身份臨時(shí)切換為其它賬號(hào)
  • 無(wú)Cookie模式 —— APP、小程序等前后臺(tái)分離場(chǎng)景
  • 同端互斥登錄 —— 像QQ一樣手機(jī)電腦同時(shí)在線,但是兩個(gè)手機(jī)上互斥登錄
  • 多賬號(hào)認(rèn)證體系 —— 比如一個(gè)商城項(xiàng)目的user表和admin表分開鑒權(quán)
  • 花式token生成 —— 內(nèi)置六種token風(fēng)格,還可自定義token生成策略
  • 注解式鑒權(quán) —— 優(yōu)雅的將鑒權(quán)與業(yè)務(wù)代碼分離
  • 路由攔截式鑒權(quán) —— 根據(jù)路由攔截鑒權(quán),可適配restful模式
  • 自動(dòng)續(xù)簽 —— 提供兩種token過(guò)期策略,靈活搭配使用,還可自動(dòng)續(xù)簽
  • 會(huì)話治理 —— 提供方便靈活的會(huì)話查詢接口
  • 記住我模式 —— 適配[記住我]模式,重啟瀏覽器免驗(yàn)證
  • 密碼加密 —— 提供密碼加密模塊,可快速M(fèi)D5、SHA1、SHA256、AES、RSA加密
  • 組件自動(dòng)注入 —— 零配置與Spring等框架集成

快速集成

依賴導(dǎo)入

  1. <dependency> 
  2.     <groupId>cn.dev33</groupId> 
  3.     <artifactId>sa-token-spring-boot-starter</artifactId> 
  4.     <version>1.15.2</version> 
  5. </dependency> 

“最新版本去maven中央庫(kù)自己查詢下,當(dāng)前是1.15.2。

配置文件

你可以零配置啟動(dòng)項(xiàng)目但同時(shí)你也可以在application.yml中增加如下配置,定制性使用框架:

  1. spring:  
  2.     # sa-token配置 
  3.     sa-token:  
  4.         # token名稱 (同時(shí)也是cookie名稱) 
  5.         token-name: satoken 
  6.         # token有效期,單位s 默認(rèn)30天, -1代表永不過(guò)期  
  7.         timeout: 2592000 
  8.         # token臨時(shí)有效期 (指定時(shí)間內(nèi)無(wú)操作就視為token過(guò)期) 單位: 秒 
  9.         activity-timeout: -1 
  10.         # 是否允許同一賬號(hào)并發(fā)登錄 (為true時(shí)允許一起登錄, 為false時(shí)新登錄擠掉舊登錄)  
  11.         allow-concurrent-login: true 
  12.         # 在多人登錄同一賬號(hào)時(shí),是否共用一個(gè)token (為true時(shí)所有登錄共用一個(gè)token, 為false時(shí)每次登錄新建一個(gè)token)  
  13.         is-share: false 
  14.         # token風(fēng)格 
  15.         token-style: uuid 

登錄

  1. @PostMapping("/api/v1/login"
  2.     @ApiOperationSupport(order = 1) 
  3.     @ApiOperation(value = "登錄"
  4.     public Response login(String userName, String pwd) { 
  5.         log.info("login,username:{},pwd:{}", userName, pwd); 
  6.         // 模擬 校驗(yàn)用戶名密碼  
  7.         Long userId = check(userName,pwd); 
  8.         StpUtil.setLoginId(userId); 
  9.         return Response.ok(StpUtil.getTokenInfo()); 
  10.     } 

核心就一行StpUtil.setLoginId(userId),來(lái)看看它幫我們做了什么?

源碼及其簡(jiǎn)單,還有很多中文注釋,跟著讀就行了,直接貼結(jié)論。

  • 創(chuàng)建token
  • 創(chuàng)建SaSession
  • 在session上記錄token簽名
  • 創(chuàng)建token、loginId映射
  • token寫入cookie

底層會(huì)話等存儲(chǔ)使用的是Map

源碼如下:

  1. /** 
  2.  * 數(shù)據(jù)集合  
  3.  */ 
  4. public Map<String, Object> dataMap = new ConcurrentHashMap<String, Object>(); 
  5.  
  6. /** 
  7.  * 過(guò)期時(shí)間集合 (單位: 毫秒) , 記錄所有key的到期時(shí)間 [注意不是剩余存活時(shí)間]  
  8.  */ 
  9. public Map<String, Long> expireMap = new ConcurrentHashMap<String, Long>(); 

調(diào)用結(jié)果如下:

  • Response Heards
  1. Connection: keep-alive 
  2. Content-Type: application/json 
  3. Date: Fri, 09 Apr 2021 07:33:59 GMT 
  4. Keep-Alive: timeout=60 
  5. // 重點(diǎn) 
  6. Set-Cookie: LakerToken=da14afd3f4b648a889a1e51ac3ec53d7; Max-Age=1800; Expires=Fri, 09-Apr-2021 08:03:59 GMT; Path=/ 
  7. Transfer-Encoding: chunked 
  • Response Body
  1.  "code": 200, 
  2.  "msg"""
  3.  "data": { 
  4.   "tokenName""LakerToken"
  5.   "tokenValue""da14afd3f4b648a889a1e51ac3ec53d7"
  6.   "isLogin"true
  7.   "loginId""1"
  8.   "loginKey""login"
  9.   "tokenTimeout": 1784, 
  10.   "sessionTimeout": 1784, 
  11.   "tokenSessionTimeout": -2, 
  12.   "tokenActivityTimeout": 30, 
  13.   "loginDevice""default-device" 
  14.  } 

可以看到返回heards中已自動(dòng)設(shè)置:Set-Cookie: LakerToken=da14afd3f4b648a889a1e51ac3ec53d7; Max-Age=1800; Expires=Fri, 09-Apr-2021 08:03:59 GMT; Path=/

登出

  1. @PostMapping("/api/v1/loginOut"
  2.  @ApiOperationSupport(order = 3) 
  3.  @ApiOperation(value = "登出"
  4.  @SaCheckLogin 
  5.  public Response loginOut() { 
  6.      StpUtil.logout(); 
  7.      return Response.ok(); 
  8.  } 

核心也是一行StpUtil.logout(),來(lái)看看它幫我們做了什么?

  • 獲取HttpRequest
  • 嘗試從request里讀取token
  • 嘗試從請(qǐng)求體里面讀取token
  • 嘗試從header里讀取token
  • 嘗試從cookie里讀取token
  • 刪除cookie
  • 刪除token、loginId映射
  • 注銷session

請(qǐng)求攔截鑒權(quán)

第一步:配置全局?jǐn)r截器

  1. @Configuration 
  2. public class MySaTokenConfig implements WebMvcConfigurer { 
  3.  /** 
  4.   * 注冊(cè)sa-token的攔截器,打開注解式鑒權(quán)功能 (如果您不需要此功能,可以刪除此類)  
  5.   */ 
  6.     @Override 
  7.     public void addInterceptors(InterceptorRegistry registry) { 
  8.         registry.addInterceptor(new SaAnnotationInterceptor()).addPathPatterns("/**");  
  9.     } 

第二步:在需要攔截的類或者方法上加注解

  • @SaCheckLogin: 標(biāo)注在方法或類上,當(dāng)前會(huì)話必須處于登錄狀態(tài)才可通過(guò)校驗(yàn)
  • @SaCheckRole("admin"): 標(biāo)注在方法或類上,當(dāng)前會(huì)話必須具有指定角色標(biāo)識(shí)才能通過(guò)校驗(yàn)
  • @SaCheckPermission("user:add"): 標(biāo)注在方法或類上,當(dāng)前會(huì)話必須具有指定權(quán)限才能通過(guò)校驗(yàn)

例如:

  1. @GetMapping("/api/v1/tokenInfo"
  2.    @ApiOperationSupport(order = 2) 
  3.    @ApiOperation(value = "獲取當(dāng)前會(huì)話的token信息"
  4.    @SaCheckLogin 
  5.    public Response tokenInfo() { 
  6.        return Response.ok(StpUtil.getTokenInfo()); 
  7.    } 

加上@SaCheckLogin則該接口必須處于登錄狀態(tài)才可通過(guò)校驗(yàn)。

這里核心攔截校驗(yàn)又是如何工作的呢?可以看下SaAnnotationInterceptor.java源碼,基于SpringMvc的攔截器實(shí)現(xiàn)的攔截校驗(yàn)。

實(shí)現(xiàn)功能如下:

  • 驗(yàn)證登錄
  • 驗(yàn)證角色
  • 驗(yàn)證權(quán)限

實(shí)現(xiàn)流程原理如下:

  • 獲取HttpRequest中的token
    • 嘗試從request里讀取token
    • 嘗試從請(qǐng)求體里面讀取token
    • 嘗試從header里讀取token
    • 嘗試從cookie里讀取token
  • 判斷token
    • 無(wú)效token
    • 過(guò)期
    • 被頂下線
    • 被踢下線
  • 自動(dòng)續(xù)期

權(quán)限和角色擴(kuò)展

直接實(shí)現(xiàn)StpInterface接口,覆寫getPermissionList和getRoleList方法即可。

  1. @Component 
  2. public class StpInterfaceImpl implements StpInterface { 
  3.     /** 
  4.      * 返回一個(gè)賬號(hào)所擁有的權(quán)限碼集合 
  5.      */ 
  6.     @Override 
  7.     public List<String> getPermissionList(Object loginId, String loginKey) { 
  8.        xxx 
  9.     } 
  10.     /** 
  11.      * 返回一個(gè)賬號(hào)所擁有的角色標(biāo)識(shí)集合 
  12.      */ 
  13.     @Override 
  14.     public List<String> getRoleList(Object loginId, String loginKey) { 
  15.         xxx 
  16.     } 

集群環(huán)境

Sa-token默認(rèn)將會(huì)話數(shù)據(jù)保存在內(nèi)存中,此模式讀寫速度最快,且避免了序列化與反序列化帶來(lái)的性能消耗,但是此模式也有一些缺點(diǎn),比如:重啟后數(shù)據(jù)會(huì)丟失,無(wú)法在集群模式下共享數(shù)據(jù)。

為此,sa-token將數(shù)據(jù)持久操作全部抽象到 SaTokenDao 接口中,此設(shè)計(jì)可以保證開發(fā)者對(duì)框架進(jìn)行靈活擴(kuò)展,比如我們可以將會(huì)話數(shù)據(jù)存儲(chǔ)在 Redis、Memcached等專業(yè)的緩存中間件中,做到重啟數(shù)據(jù)不丟失,而且保證分布式環(huán)境下多節(jié)點(diǎn)的會(huì)話一致性。

除了框架內(nèi)部對(duì)SaTokenDao提供的基于內(nèi)存的默認(rèn)實(shí)現(xiàn),我們使用官網(wǎng)提供的Redis擴(kuò)展。

依賴導(dǎo)入

  1. <!-- sa-token整合redis (使用jackson序列化方式) --> 
  2. <dependency> 
  3.     <groupId>cn.dev33</groupId> 
  4.     <artifactId>sa-token-dao-redis-jackson</artifactId> 
  5.     <version>1.15.2</version> 
  6. </dependency> 
  7. <!-- 提供redis連接池 --> 
  8. <dependency> 
  9.     <groupId>org.apache.commons</groupId> 
  10.     <artifactId>commons-pool2</artifactId> 
  11. </dependency> 

“使用Jackson序列化方式,Session序列化后可讀性強(qiáng),可靈活手動(dòng)修改

配置文件

  1. spring:  
  2.     # redis配置  
  3.     redis: 
  4.         # Redis數(shù)據(jù)庫(kù)索引(默認(rèn)為0) 
  5.         database: 0 
  6.         # Redis服務(wù)器地址 
  7.         host: 127.0.0.1 
  8.         # Redis服務(wù)器連接端口 
  9.         port: 6379 
  10.         # Redis服務(wù)器連接密碼(默認(rèn)為空) 
  11.         # password:  
  12.         # 連接超時(shí)時(shí)間(毫秒) 
  13.         timeout: 1000ms 
  14.         lettuce: 
  15.             pool: 
  16.                 # 連接池最大連接數(shù) 
  17.                 max-active: 200 
  18.                 # 連接池最大阻塞等待時(shí)間(使用負(fù)值表示沒(méi)有限制) 
  19.                 max-wait: -1ms 
  20.                 # 連接池中的最大空閑連接 
  21.                 max-idle: 10 
  22.                 # 連接池中的最小空閑連接 
  23.                 min-idle: 0 

引入依賴和配置后,框架會(huì)自動(dòng)使用Redis存儲(chǔ)。

總結(jié)

初步嘗試還挺不錯(cuò)的,文檔和代碼示例都很全,基本功能都能滿足,源碼簡(jiǎn)單易懂,可以隨意二開,封裝度非常高,不理解原理的就很容易變成工具人了,其他的等用一段時(shí)間再評(píng)論。

參考:

http://sa-token.dev33.cn/

https://github.com/dromara/sa-token

 

責(zé)任編輯:武曉燕 來(lái)源: Java大廠面試官
相關(guān)推薦

2021-09-01 10:07:43

開發(fā)零搭建Groovy

2021-03-09 17:11:09

數(shù)據(jù)庫(kù)腳手架開發(fā)

2021-04-28 16:10:48

開發(fā)腳手架 Spring

2021-05-13 17:02:38

MDC腳手架日志

2021-07-13 18:42:38

Spring Boot腳手架開發(fā)

2020-08-19 08:55:47

Redis緩存數(shù)據(jù)庫(kù)

2021-04-20 19:24:16

腳手架 Java微信

2021-06-02 17:58:49

腳手架 冪等性前端

2021-02-19 22:43:50

開發(fā)腳手架Controller

2021-07-29 18:49:49

Spring開發(fā)腳手架

2023-11-28 17:24:45

2022-02-18 08:34:33

JavaSa-Token項(xiàng)目

2021-03-11 14:16:47

Spring Boo開發(fā)腳手架

2016-08-10 14:59:41

前端Javascript工具

2022-04-24 11:33:47

代碼管理工程

2023-11-21 17:36:04

OpenFeignSentinel

2014-08-15 09:36:06

2021-01-07 05:34:07

腳手架JDK緩存

2018-08-30 16:08:37

Node.js腳手架工具

2018-06-11 14:39:57

前端腳手架工具node.js
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)