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

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - 實戰(zhàn)!Spring Cloud Gateway集成 Rbac 權(quán)限模型實現(xiàn)動態(tài)權(quán)限控制!

實戰(zhàn)!Spring Cloud Gateway集成 Rbac 權(quán)限模型實現(xiàn)動態(tài)權(quán)限控制!

2022-01-07 21:53碼猿技術(shù)專欄不才陳某 Java教程

本篇文章介紹了網(wǎng)關(guān)集成RBAC權(quán)限模型進行認證鑒權(quán),核心思想就是將權(quán)限信息加載Redis緩存中,在網(wǎng)關(guān)層面的鑒權(quán)管理器中進行權(quán)限的校驗,其中還整合了Restful風(fēng)格的URL。

實戰(zhàn)!Spring Cloud Gateway集成 Rbac 權(quán)限模型實現(xiàn)動態(tài)權(quán)限控制!

這篇文章介紹下網(wǎng)關(guān)層如何集成RBAC權(quán)限模型進行認證鑒權(quán),文章目錄如下:

實戰(zhàn)!Spring Cloud Gateway集成 Rbac 權(quán)限模型實現(xiàn)動態(tài)權(quán)限控制!

什么是RBAC權(quán)限模型?

RBAC(Role-Based Access Control)基于角色訪問控制,目前使用最為廣泛的權(quán)限模型。

相信大家對這種權(quán)限模型已經(jīng)比較了解了。此模型有三個用戶、角色和權(quán)限,在傳統(tǒng)的權(quán)限模型用戶直接關(guān)聯(lián)加了角色層,解耦了用戶和權(quán)限,使得權(quán)限系統(tǒng)有了更清晰的職責(zé)劃分和更高的靈活度。

實戰(zhàn)!Spring Cloud Gateway集成 Rbac 權(quán)限模型實現(xiàn)動態(tài)權(quán)限控制!

以上五張表的SQL就不再詳細貼出來了,都會放在案例源碼的doc目錄下,如下圖:

實戰(zhàn)!Spring Cloud Gateway集成 Rbac 權(quán)限模型實現(xiàn)動態(tài)權(quán)限控制!

設(shè)計思路

RBAC權(quán)限模型是基于角色的,因此在Spring Security中的權(quán)限就是角色,具體的認證授權(quán)流程如下:

  • 用戶登錄申請令牌
  • 通過UserDetailService查詢、加載用戶信息、比如密碼、權(quán)限(角色)....封裝到UserDetails中
  • 令牌申請成功,攜帶令牌訪問資源
  • 網(wǎng)關(guān)層面比較訪問的URL所需要的權(quán)限(Redis中)是否與當前令牌具備的權(quán)限有交集。有交集則表示具備訪問該URL的權(quán)限。
  • 具備權(quán)限則訪問,否則拒絕

上述只是大致的流程,其中還有一些細節(jié)有待商榷,如下:

1、URL對應(yīng)的權(quán)限如何維護?

這個就比較容易實現(xiàn)了,涉及到RBAC權(quán)限模式的三張表,分別為權(quán)限表、角色表、權(quán)限角色對應(yīng)關(guān)系表。具體實現(xiàn)流程如下:

項目啟動時將權(quán)限(URL)和角色的對應(yīng)關(guān)系加載到Redis中。

對于管理界面涉及到URL相應(yīng)關(guān)系的變動要實時的變更到Redis。

比如權(quán)限中有這么一條數(shù)據(jù),如下:

實戰(zhàn)!Spring Cloud Gateway集成 Rbac 權(quán)限模型實現(xiàn)動態(tài)權(quán)限控制!

其中的 /order/info 這個URL就是一個權(quán)限,管理員可以對其分配給指定的角色。

2、如何實現(xiàn)Restful風(fēng)格的權(quán)限控制?

restful風(fēng)格的接口URL是相同的,不同的只是請求方式,因此要想做到權(quán)限的精細控制還需要保留請求方式,比如POST,GET,PUT,DELETE....

可以在權(quán)限表中的url字段放置一個method標識,比如POST,此時的完整URL為:POST:/order/info

當然*:/order/info中的星號表示一切請求方式都滿足。

3、這樣能實現(xiàn)動態(tài)權(quán)限控制嗎?

權(quán)限的控制方式有很多種,比如Security自身的注解、方法攔截,其實擴展Spring Security也是可以實現(xiàn)動態(tài)權(quán)限控制的,這個在后面的文章中會單獨介紹!

陳某此篇文章是將權(quán)限、角色對應(yīng)關(guān)系存入Redis中,因此想要實現(xiàn)動態(tài)權(quán)限控制只需要在Redis中維護這種關(guān)系即可。Redis中的數(shù)據(jù)如下:

實戰(zhàn)!Spring Cloud Gateway集成 Rbac 權(quán)限模型實現(xiàn)動態(tài)權(quán)限控制!

案例實現(xiàn)

此篇文章還是基于以下三個模塊進行改動,有不清楚的可以查看陳某往期文章。

名稱 功能
oauth2-cloud-auth-server OAuth2.0認證授權(quán)服
oauth2-cloud-gateway 網(wǎng)關(guān)服務(wù)
oauth2-cloud-auth-common 公共模塊

涉及到的更改目錄如下圖:

實戰(zhàn)!Spring Cloud Gateway集成 Rbac 權(quán)限模型實現(xiàn)動態(tài)權(quán)限控制!

1、從數(shù)據(jù)庫加載URL<->角色對應(yīng)關(guān)系到Redis

在項目啟動之初直接讀取數(shù)據(jù)庫中的權(quán)限加載到Redis中,當然方法有很多種,自己根據(jù)情況選擇。代碼如下:

實戰(zhàn)!Spring Cloud Gateway集成 Rbac 權(quán)限模型實現(xiàn)動態(tài)權(quán)限控制!

此處代碼在oauth2-cloud-auth-server模塊下。

案例源碼已經(jīng)上傳GitHub,關(guān)注公眾號:碼猿技術(shù)專欄,回復(fù)關(guān)鍵詞:9529 獲取!

2、實現(xiàn)UserDetailsService加載權(quán)限

UserDetailsService相信大家都已經(jīng)很熟悉了,主要作用就是根據(jù)用戶名從數(shù)據(jù)庫中加載用戶的詳細信息。

代碼如下:

實戰(zhàn)!Spring Cloud Gateway集成 Rbac 權(quán)限模型實現(xiàn)動態(tài)權(quán)限控制!

①處的代碼是將通過JPA從數(shù)據(jù)庫中查詢用戶信息并且組裝角色,必須是以 ROLE_ 開頭。

②處的代碼是將獲取的角色封裝進入authorities向下傳遞。

此處代碼在oauth2-cloud-auth-server模塊下。

案例源碼已經(jīng)上傳GitHub,關(guān)注公眾號:碼猿技術(shù)專欄,回復(fù)關(guān)鍵詞:9529 獲取!

3、鑒權(quán)管理器中校驗權(quán)限

在上篇文章中實戰(zhàn)干貨!Spring Cloud Gateway 整合 OAuth2.0 實現(xiàn)分布式統(tǒng)一認證授權(quán)!詳細介紹了鑒權(quán)管理器的作用,這里就不再細說了。代碼如下:

實戰(zhàn)!Spring Cloud Gateway集成 Rbac 權(quán)限模型實現(xiàn)動態(tài)權(quán)限控制!

①處的代碼是將請求URL組裝成restful風(fēng)格的,比如POST:/order/info

②處的代碼是從Redis中取出URL和角色對應(yīng)關(guān)系遍歷,通過AntPathMatcher進行比對,獲取當前請求URL的所需的角色。

③處的代碼就是比較當前URL所需的角色和當前用戶的角色,分為兩步:

如果是超級管理員,則直接放行,不必比較權(quán)限

不是超級管理員就需要比較角色,有交集才能放行

此處的代碼在oauth2-cloud-gateway模塊中。

案例源碼已經(jīng)上傳GitHub,關(guān)注公眾號:碼猿技術(shù)專欄,回復(fù)關(guān)鍵詞:9529 獲取!

4、總結(jié)

關(guān)鍵代碼就是上述三處,另外關(guān)于一些DAO層的相關(guān)代碼就不再貼出來了,自己下載源碼看看!

案例源碼已經(jīng)上傳GitHub,關(guān)注公眾號:碼猿技術(shù)專欄,回復(fù)關(guān)鍵詞:9529 獲取!

附加的更改

這篇文章中順帶將客戶端信息也放在了數(shù)據(jù)庫中,前面的文章都是放在內(nèi)存中。

數(shù)據(jù)庫中新建一張表,SQL如下:

  1. CREATE TABLE `oauth_client_details` (
  2. `client_id` varchar(48) NOT NULL COMMENT '客戶端id',
  3. `resource_ids` varchar(256) DEFAULT NULL COMMENT '資源的id,多個用逗號分隔',
  4. `client_secret` varchar(256) DEFAULT NULL COMMENT '客戶端的秘鑰',
  5. `scope` varchar(256) DEFAULT NULL COMMENT '客戶端的權(quán)限,多個用逗號分隔',
  6. `authorized_grant_types` varchar(256) DEFAULT NULL COMMENT '授權(quán)類型,五種,多個用逗號分隔',
  7. `web_server_redirect_uri` varchar(256) DEFAULT NULL COMMENT '授權(quán)碼模式的跳轉(zhuǎn)uri',
  8. `authorities` varchar(256) DEFAULT NULL COMMENT '權(quán)限,多個用逗號分隔',
  9. `access_token_validity` int(11) DEFAULT NULL COMMENT 'access_token的過期時間,單位毫秒,覆蓋掉硬編碼',
  10. `refresh_token_validity` int(11) DEFAULT NULL COMMENT 'refresh_token的過期時間,單位毫秒,覆蓋掉硬編碼',
  11. `additional_information` varchar(4096) DEFAULT NULL COMMENT '擴展字段,JSON',
  12. `autoapprove` varchar(256) DEFAULT NULL COMMENT '默認false,是否自動授權(quán)',
  13. PRIMARY KEY (`client_id`)
  14. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

認證服務(wù)中的OAuth2.0的配置文件中將客戶端的信息從數(shù)據(jù)庫中加載,該實現(xiàn)類為JdbcClientDetailsService,關(guān)鍵代碼如下:

  1. @Override
  2. public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
  3. //使用JdbcClientDetailsService,從數(shù)據(jù)庫中加載客戶端的信息
  4. clients.withClientDetails(new JdbcClientDetailsService(dataSource));
  5. }

總結(jié)

本篇文章介紹了網(wǎng)關(guān)集成RBAC權(quán)限模型進行認證鑒權(quán),核心思想就是將權(quán)限信息加載Redis緩存中,在網(wǎng)關(guān)層面的鑒權(quán)管理器中進行權(quán)限的校驗,其中還整合了Restful風(fēng)格的URL。

原文鏈接:https://mp.weixin.qq.com/s/NjBc5whZHtfwoELrqll7jQ

延伸 · 閱讀

精彩推薦
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發(fā)現(xiàn)了對于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關(guān)于Java8中S...

    阿杜7482021-02-04
  • Java教程Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關(guān)于小米推送Java代碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩(wěn)中求8032021-07-12
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發(fā)項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程xml與Java對象的轉(zhuǎn)換詳解

    xml與Java對象的轉(zhuǎn)換詳解

    這篇文章主要介紹了xml與Java對象的轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
  • Java教程Java實現(xiàn)搶紅包功能

    Java實現(xiàn)搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現(xiàn)搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經(jīng)有好久沒有升過級了。升級完畢重啟之后,突然發(fā)現(xiàn)好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
主站蜘蛛池模板: 欧美成人精品h版在线观看 在线2区 | 久久蜜臀一区二区三区av | 视频一区二区久久 | 2017亚洲男人天堂 | 欧美精品一区二区三区久久久 | 一区二区三区四区五区中文字幕 | 国产一区日韩一区 | 日本va在线观看 | 精品国产91久久久久久浪潮蜜月 | 久久精品视频7 | 国产成人自拍小视频 | 久久蜜桃精品一区二区三区综合网 | 久久99精品久久久久久236 | 在线日韩欧美 | 国产精品爱久久久久久久 | 天天碰天天操 | 国产无遮挡一级毛片 | 激情综合婷婷久久 | 精品中文字幕久久久久四十五十骆 | 国产免费最爽的乱淫视频a 午夜精品久久久久久久99热浪潮 | 久草手机在线视频 | 白白在线免费视频 | 特级a欧美做爰片毛片 | 亚洲第一成人在线 | 77成人影院| 日韩一级片黄色 | 少妇色诱麻豆色哟哟 | 精品av在线播放 | 久久17 | 欧美成人一二区 | 精品国产乱码久久久久久久久 | 精品一区二区三区免费毛片爱 | 黄色片免费看看 | 久久丝袜脚交足黄网站免费 | 精品亚洲综合 | 欧美激情天堂 | 亚洲精品7777xxxx青睐 | 亚洲视频在线一区二区 | 国产欧美日韩一区二区三区四区 | 55夜色66夜色国产精品视频 | av在线免费观看国产 |