激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - Java教程 - 淺談Spring Cloud下微服務權限方案

淺談Spring Cloud下微服務權限方案

2021-05-10 11:15江離 Java教程

這篇文章主要介紹了淺談Spring Cloud下微服務權限方案,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

背景

從傳統的單體應用轉型spring cloud的朋友都在問我,spring cloud下的微服務權限怎么管?怎么設計比較合理?從大層面講叫服務權限,往小處拆分,分別為三塊:用戶認證用戶權限服務校驗

用戶認證

傳統的單體應用可能習慣了session的存在,而到了spring cloud的微服務化后,session雖然可以采取分布式會話來解決,但終究不是上上策。開始有人推行spring cloud security結合很好的oauth2,后面為了優化oauth 2中access token的存儲問題,提高后端服務的可用性和擴展性,有了更好token驗證方式jwt(json web token)。這里要強調一點的是,oauth2jwt這兩個根本沒有可比性,是兩個完全不同的東西。
oauth2是一種授權框架,而jwt是一種認證協議

oauth2認證框架oauth2中包含四個角色:

  1. 資源擁有者(resource owner)
  2. 資源服務器(resource server)
  3. 授權服務器(authorization server)
  4. 客戶端(client)

oauth2包含4種授權模式

  1. 授權碼(認證碼)模式 (authorization code)
  2. 簡化(隱形)模式 (impilict
  3. 用戶名密碼模式 (resource owner password credential)
  4. 客戶端模式 (client credential)

其中,oauth2的運行流程如下圖,摘自rfc 6749:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
+--------+                +---------------+
|    |--(a)- authorization request ->|  resource  |
|    |                |   owner   |
|    |<-(b)-- authorization grant ---|        |
|    |                +---------------+
|    |
|    |                +---------------+
|    |--(c)-- authorization grant -->| authorization |
| client |                |   server  |
|    |<-(d)----- access token -------|        |
|    |                +---------------+
|    |
|    |                +---------------+
|    |--(e)----- access token ------>|  resource  |
|    |                |   server  |
|    |<-(f)--- protected resource ---|        |
+--------+                +---------------+

我們在spring cloud oauth2中,所有訪問微服務資源的請求都在http header中攜帶token,被訪問的服務接下來再去請求授權服務器驗證token的有效性,目前這種方式,我們需要兩次或者更多次的請求,所有的token有效性校驗都落在的授權服務器上,對于我們系統的水平擴展成為一個非常大的瓶頸。

jwt認證協議

授權服務器將用戶信息和授權范圍序列化后放入一個json字符串,然后使用base64進行編碼,最終在授權服務器用私鑰對這個字符串進行簽名,得到一個json web token

假設其他所有的資源服務器都將持有一個rsa公鑰,當資源服務器接收到這個在http header中存有token的請求,資源服務器就可以拿到這個token,并驗證它是否使用正確的私鑰簽名(是否經過授權服務器簽名,也就是驗簽)。驗簽通過,反序列化后就拿到toekn中包含的有效驗證信息。

其中,主體運作流程圖如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
+-----------+                   +-------------+
|      |    1-request authorization    |       |
|      |------------------------------------>|       |
|      |   grant_type&username&password  |       |--+
|      |                   |authorization| | 2-gen
|      |                   |service   | |  jwt
|      |    3-response authorization   |       |<-+
|      |<------------------------------------| private key |
|      |  access_token / refresh_token   |       |
|      |  token_type / expire_in      |       |
| client  |                   +-------------+
|      |                
|      |                   +-------------+
|      |    4-request resource      |       |
|      |-----------------------------------> |       |
|      | authorization: bearer access token |       |--+
|      |                   | resource  | | 5-verify
|      |                   | service   | | token
|      |    6-response resource      |       |<-+
|      |<----------------------------------- | public key |
+-----------+                   +-------------+

通過上述的方式,我們可以很好地完成服務化后的用戶認證。

用戶權限

傳統的單體應用的權限攔截,大家都喜歡shiro,而且用的頗為順手。可是一旦拆分后,這權限開始分散在各個api了,shiro還好使嗎?筆者在項目中,并沒有用shiro。前后端分離后,交互都是token,后端的服務無狀態化,前端按鈕資源化,權限放哪兒管好使?

抽象與設計

在介紹靈活的核心設計前,先給大家普及一個入門的概念:rbac(role-based access control,基于角色的訪問控制),就是用戶通過角色與權限進行關聯。簡單地說,一個用戶擁有若干角色,每一個角色擁有若干權限。

rbac其實是一種分析模型,主要分為:基本模型rbac0(core rbac)、角色分層模型rbac1(hierarchal rbac)、角色限制模型rbac2(constraint rbac)和統一模型rbac3(combines rbac)。

核心uml

淺談Spring Cloud下微服務權限方案

這是筆者通過多種業務場景后抽象的rbac關系圖

類說明

group

群或組,擁有一定數量權限的集合,亦可以是權限的載體。

子類:user(用戶)、role(角色)、position(崗位)、unit(部門),通過用戶的特定構成,形成不同業務場景的群或組,而通過對群或組的父類授權,完成了用戶的權限獲取。

permission

權限,擁有一定數量資源的集成,亦可以是資源的載體。

resources

權限下有資源,資源的來源有:menu(菜單)、button(動作權限)、頁面元素(按鈕、tab等)、數據權限等

program

程序,相關權限控制的呈現載體,可以在多個菜單中掛載。

常見web程序基本構成

淺談Spring Cloud下微服務權限方案

模型與微服務的關系

如果把spring cloud服務化后的所有api接口都定義為上文的resources,那么我們可以看到這么一個情況。

比如一個用戶的增刪改查,我們的頁面會這么做

淺談Spring Cloud下微服務權限方案

 

 

頁面元素 資源編碼 資源uri 資源請求方式
查詢 user_btn_get /api/user/{id} get
增加 user_btn_add /api/user post
編輯 user_btn_edit /api/user/{id} put
刪除 user_btn_del /api/user/{id} delete

 

在抽象成上述的映射關系后,我們的前后端的資源有了參照,我們對于用戶組的權限授權就容易了。比如我授予一個用戶增加、刪除權限。在前端我們只需要檢驗該資源編碼的有無就可以控制按鈕的顯示和隱藏,而在后端我們只需要統一攔截判斷該用戶是否具有uri和對應請求方式即可。

至于權限的統一攔截是放置在zuul這個網關上,還是落在具體的后端服務的攔截器上(filter、inteceptor),都可以輕而易舉地實現。不在局限于代碼的侵入性。放置zuul流程圖如下:

淺談Spring Cloud下微服務權限方案

要是權限的統一攔截放置在zuul上,會有一個問題,那就是后端服務安不安全,服務只需要通過注冊中心,即可對其他服務進行調用。這里就涉及到后面的第三個模塊,服務之間的鑒權。

服務之間的鑒權

因為我們都知道服務之間開源通過注冊中心尋到客戶端后,直接遠程過程調用的。對于生產上的各個服務,一個個敏感性的接口,我們更是需要加以保護。主題的流程如下圖:

淺談Spring Cloud下微服務權限方案

筆者的實現方式是基于spring cloud的feignclient inteceprot(自動申請服務token、傳遞當前上下文)和mvc inteceptor(服務token校驗、更新當前上下文)來實現,從而對服務的安全性做進一步保護。

結合spring cloud的特性后,整體流程圖如下:

淺談Spring Cloud下微服務權限方案

優化點

雖然通過上述的用戶合法性檢驗、用戶權限攔截以及服務之間的鑒權,保證了api接口的安全性,但是其間的http訪問頻率是比較高的,請求數量上來的時候,的問題是就會特別明顯。可以考慮一定的優化策略,比如用戶權限緩存、服務授權信息的派發與混存、定時刷新服務鑒權token等。

結語

上述是筆者在項目里的大體思路,有興趣的朋友可以借鑒我的開源項目,歡迎star:
- gitchina:https://gitee.com/minull/ace-security(Jwt、用戶權限) 
- github:https://github.com/wxiaoqi/ace-security 
- gitchina:http://git.oschina.net/geek_qi/ace-gate(服務鑒權)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/u011282930/article/details/80131534

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久精品影视 | 免费在线成人网 | 黄色电影免费提供 | 久久亚洲成人 | 黄色片视频观看 | 中文字幕精品在线播放 | 日日cao | 免费在线观看亚洲 | 久久性生活免费视频 | 中文字幕精品在线播放 | 精品一区二区三区日本 | 日本高清在线免费 | 欧美一级免费看 | 精品亚洲va在线va天堂资源站 | 欧美日韩网站在线观看 | 久久久99精品视频 | 色999中文字幕 | 欧美亚洲综合在线 | 99爱精品在线 | 黄视频网站免费在线观看 | 日韩视频在线视频 | 91美女视频在线观看 | 国产精品一区二区羞羞答答 | 中文字幕一区在线观看视频 | 免费黄色入口 | 黄色av一区二区三区 | 曰批全过程120分钟免费69 | 中午字幕无线码一区2020 | 一级毛片在线观看视频 | 一级性生活视频 | 女人久久久www免费人成看片 | 久久精品国产99久久久古代 | 成人免费福利视频 | 精品久久久久久久久久久αⅴ | 久久久久久久久久91 | 草莓福利社区在线 | 在火车上摸两乳爽的大叫 | 成人不卡 | 日韩av成人 | 草b视频在线观看 | 亚洲精品aaaaa|