日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Spring Security 中細化權限粒度的方法

瀏覽:227日期:2023-08-13 10:39:02

有小伙伴表示微人事(https://github.com/lenve/vhr)的權限粒度不夠細。不過松哥想說的是,技術都是相通的,明白了 vhr 中權限管理的原理,在此基礎上就可以去細化權限管理粒度,細化過程和還是用的 vhr 中用的技術,只不過設計層面重新規劃而已。

當然今天我想說的并不是這個話題,主要是想和大家聊一聊 Spring Security 中權限管理粒度細化的問題。因為這個問題會涉及到不同的權限管理模型,今天和小伙伴們聊一聊~

1.權限管理模型

要想將細化權限粒度,我們不可避免會涉及到一些權限模型,例如 ACL、RBAC、DAC、MAC 以及 ABAC、PBAC 等。

在這些眾多的權限模型中,我們使用較多的是 RBAC,ACL 也有一些項目在使用,另外幾種則使用相對較少。因此松哥這里重點和大家介紹 ACL 和 RBAC。

1.1 ACL

ACL 是一種比較古老的權限控制模型。英文全稱是 Access Control List,中文稱作訪問控制列表,這是一種面向資源的訪問控制模型,所有的權限配置都是針對資源的。

它的原理是這樣:

對于系統中的每一個資源,都會配置一個訪問列表,這個列表中記錄了用戶/角色對于資源的 CURD 權限,當系統需要訪問這些資源時,會首先檢查列表中是否存在當前用戶的訪問權限,進而確定當前用戶是否可以執行相應的操作。

ACL 的使用非常簡單,搞明白它的原理自己分分鐘就能實現。但是 ACL 有一個明顯的缺點,就是需要維護大量的訪問權限列表。大量的訪問控制列表帶來的問題就是性能下降以及維護復雜。

1.2 RBAC

RBAC(Role-based access control)是一種以角色為基礎的訪問控制,也是目前使用較多的一種權限模型,它有多種不同的變體,松哥后面會專門寫一篇文章來介紹 RBAC,這里僅簡單科普下。

RBAC 權限模型將用戶按角色進行歸類,通過用戶的角色來確定用戶對某項資源是否具備操作權限。RBAC 簡化了用戶與權限的管理,它將用戶與角色關聯、角色與權限管理、權限與資源關聯,這種模式使得用戶的授權管理變得非常簡單和易于維護。

1.3 其他

下面這些使用常見較少,小伙伴們做一個了解即可,感興趣的小伙伴也可以自行研究下。

ABAC:這是一種基于屬性的訪問控制。 PBAC:這是一種基于策略的訪問控制。 DAC:除了權限控制,主體也可以將權限授予其他主體。 MAC:資源可以被哪些類別的主體進行哪些操作,主體可以對哪些等級的資源進行哪些操作,這兩個條件同時滿足時,允許訪問。

2.ACL

接下來松哥要和大家仔細介紹一下 ACL 這種權限模型,RBAC 我后面專門寫文章介紹,本文先不做討論。

Acl 的全稱是 Access Control List,也就是我們所說的訪問控制列表,是用以控制對象的訪問權限的。Acl 的一個核心思路就是將某個對象的某種權限授予某個用戶或某種角色,它們之間的關系是多對多,即一個用戶/角色可以具備某個對象的多種權限,某個對象的權限也可以被多個用戶/角色所持有。

舉個簡單例子:

現在有一個 User 對象,針對該對象有查詢、修改、刪除等權限,可以將這些權限賦值給某一個用戶,也可以將這些權限賦值給某一個角色,當用戶具備這些角色時就具有執行相應操作的權限。

從這個角度看,Acl 是一種粒度非常細的權限控制,它就是專門控制某一個對象的操作權限。所有的這些權限都記錄在數據庫中,這帶來了另外一個問題就是需要維護的權限數據量非常龐大,不利于后期擴展。當然,對于一個簡單的系統,使用 Acl 還是可以的,沒有任何問題。

2.1 核心概念

接下來我們來看看 Acl 中一些核心概念。

Sid

Sid 代表了用戶和角色,它有兩種:GrantedAuthoritySid 和 PrincipalSid,前者代表角色,后者代表用戶。在 Spring Security 中,用戶和角色信息都是保存在 Authentication 對象中的,即 Sid 是從 Authentication 對象中提取出來的,提取出來的值是 GrantedAuthoritySid+PrincipalSid,而不是其中某一項,具體的提取方法是 SidRetrievalStrategyImpl#getSids,相關源碼如下:

public List<Sid> getSids(Authentication authentication) {Collection<? extends GrantedAuthority> authorities = roleHierarchy.getReachableGrantedAuthorities(authentication.getAuthorities());List<Sid> sids = new ArrayList<>(authorities.size() + 1);sids.add(new PrincipalSid(authentication));for (GrantedAuthority authority : authorities) {sids.add(new GrantedAuthoritySid(authority));}return sids;}

這個 Sid 大家可以簡單理解為當前用戶的權限(這個說法不是很準確,可以近似理解)。

ObjectIdentity

ObjectIdentity 是一個域對象,這是官方的說法,有點拗口。實際上這就是你要操作的對象。

例如我有一個 User 對象,如果直接去記錄能夠對 User 對象執行哪些操作,這就會導致高耦和。所以我們需要對其解耦,將所有需要操作的對象通過 ObjectIdentity 描述出來,這樣就能確保權限系統不和具體的業務綁定。

ObjectIdentity 中有兩個關鍵方法,getType 和 getIdentifier。一般來說,getType 方法返回真實對象類的全路徑,例如 org.javaboy.acl.model.User,getIdentifier 方法則返回真實對象的 id,通過這兩個方法,就能夠鎖定一個對象。

Acl

看名字就知道,這算是整個系統的核心調度部分。

一個 Acl 對象會關聯一個 ObjectIdentity,一個 Acl 對象還擁有一個 Sid,這個 Sid 表示這個 Acl 是屬于誰的?屬于誰,誰就可以修改甚至刪除這個 Acl 對象。

AccessControlEntry

AccessControlEntry 簡寫為 ACE,一個 AccessControlEntry 對象代表一條權限記錄。每一個 AccessControlEntry 都對應了一個 Acl,一個 Acl 對象對應多個 AccessControlEntry,有了這層對應關系,相當于就知道這個權限操作的是哪個對象。

然后 AccessControlEntry 中還包含一個 Sid 和一個 Permission 對象,表示某個 Sid 具備某種權限。

可以看到,Acl+ACE,就描述出來了某個 Sid 可以具備某個 ObjectIdentity 的某種 Permission。

Permission

這個就是具體的權限對象。似乎是受 Linux 影響,它使用了權限掩碼,最多支持 232-1 種權限。

Spring Security 種默認定義了五種

public class BasePermission extends AbstractPermission {public static final Permission READ = new BasePermission(1 << 0, ’R’); // 1public static final Permission WRITE = new BasePermission(1 << 1, ’W’); // 2public static final Permission CREATE = new BasePermission(1 << 2, ’C’); // 4public static final Permission DELETE = new BasePermission(1 << 3, ’D’); // 8public static final Permission ADMINISTRATION = new BasePermission(1 << 4, ’A’); // 16protected BasePermission(int mask) {super(mask);}protected BasePermission(int mask, char code) {super(mask, code);}}

 AclService

AclService 接口中主要定義了一些解析 Acl 對象的方法,通過 ObjectIdentity 對象解析出其對應的 Acl。

AclService 主要有兩類實現接口:

JdbcAclService JdbcMutableAclService

前者主要是針對 Acl 的查詢操作,后者支持 Acl 的添加、更新以及刪除等操作。我們常用的是 JdbcMutableAclService。

至此,Acl 中一些核心概念就和小伙伴們介紹完了。

2.2 Acl 數據表

上面提到的對象數據,都需要對應的數據表來維護,在 spring-security-acl 依賴中,為這些數據表都提供了腳本。

Spring Security 中細化權限粒度的方法

可以看到,針對不同類型的數據庫,都有對應的腳本。

這里主要涉及到四張表,接下來松哥以 MySQL 腳本為例,來分別介紹每張表的作用及其字段的含義。

acl_class

acl_class 是用來保存對象類型的全路徑,如下:

Spring Security 中細化權限粒度的方法

這里的 id 自增長,class 中保存的是相應對象的全路徑名。

acl_sid

acl_sid 表用來保存 Sid 的。

Spring Security 中細化權限粒度的方法

根據前面的介紹,存在兩種類型的 Sid,GrantedAuthoritySid 和 PrincipalSid。所以這里的 principal 字段表示該 Sid 是哪種類型的。

acl_object_identity

acl_object_identity 用來保存需要進行訪問控制的對象信息。

Spring Security 中細化權限粒度的方法

object_id_class:關聯 acl_class.id。 object_id_identity:需要控制的對象的 id。 parent_object:父對象 ID,關聯一條 acl_object_identity 記錄。 owner_sid:這個 acl 記錄擁有者的 sid。 entries_inheriting:是否需要繼承父對象的權限。

簡單來說,這個表中的 object_id_class 和 object_id_identity 字段鎖定了你要進行權限控制的對象,具體如何控制呢?則要看 acl_entry 中的關聯關系了。

acl_entry

這個表單純看數據,一堆數字。

Spring Security 中細化權限粒度的方法

松哥來捋一下,大家就懂了。

acl_object_identity:關聯 acl_object_identity.id。 ace_order:權限順序。 acl_object_identity 和 ace_order 的組合要唯一。 sid:關聯 acl_sid.id。 這條權限記錄關聯哪個用戶/角色。 mask:權限掩碼。 granting:表示當前記錄是否生效。 audit_success/audit_failure:審計信息。

簡單來說,acl_entry 中的一條記錄,關聯了一個要操作的對象(acl_object_identity 和 ace_order 字段),關聯了 Sid(sid 字段),也描述了權限(mask),將權限涉及到的東西都在該字段中整合起來了。

3.小結

好啦,這就本文和小伙伴們科普一下 ACL 的概念,下篇文章松哥通過一個完整的案例來和小伙伴們演示具體用法~

參考資料:

https://blog.gaoyuexiang.cn/2020/07/02/spring-security-acl-conception-and-component

https://www.iteye.com/blog/elim-2269021

到此這篇關于Spring Security 中細化權限粒度的方法的文章就介紹到這了,更多相關Spring Security 細化權限粒度內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久中文欧美| 久久最新视频| 日韩av一区二区三区| 综合亚洲视频| 日韩三区四区| 国产剧情一区| 国产精品18| 国产一区二区色噜噜| 亚洲三级欧美| 欧美中文一区二区| 久久免费高清| 欧美特黄一区| 蜜臀av一区二区在线免费观看 | 久久亚州av| 精品精品99| 亚洲播播91| 好看的av在线不卡观看| 日本 国产 欧美色综合| 亚洲精品第一| 国产精品a级| 亚洲天堂av影院| 日韩成人亚洲| 亚洲欧美日本日韩| 青青青国产精品| 国产成人精品亚洲线观看 | 蜜桃av一区二区三区电影| 日韩精品三级| 国产一区二区三区网| 成人精品天堂一区二区三区| 国产精品91一区二区三区| 日韩在线电影| 色乱码一区二区三区网站| 国产一区清纯| 日韩一区二区三区四区五区| 美女视频黄久久| 久久久久99| 女主播福利一区| 精品一区二区男人吃奶| 国产福利一区二区三区在线播放| 国产精品伊人| 亚洲va中文在线播放免费| 一区二区小说| 国产精品色网| 国产欧美高清| 亚洲免费观看| 亚洲日本网址| 久久99影视| 欧美日韩一视频区二区| 免费观看不卡av| 日韩一区二区三免费高清在线观看 | 亚洲一区观看| 麻豆国产精品一区二区三区| 亚洲激情不卡| 国产精品成人一区二区网站软件| 欧美精选一区二区三区| 国产精品成久久久久| 国产精品一区免费在线| 国产精品色网| 伊人久久亚洲美女图片| 狠狠久久伊人| 在线看片国产福利你懂的| 亚洲涩涩av| 一区福利视频| 欧美大黑bbbbbbbbb在线| 高清日韩中文字幕| 国产欧美一区二区三区精品观看| 日本成人在线网站| 亚洲一区观看| 久久在线免费| 在线一区免费观看| 视频一区视频二区中文| 国产精品7m凸凹视频分类| 免费在线欧美视频| 九九精品调教| 视频一区国产视频| 久久一区亚洲| 亚洲成人va| 欧美成人一二区| 蜜臀久久99精品久久久画质超高清| 巨乳诱惑日韩免费av| 97精品国产福利一区二区三区| 亚洲精品极品| 18国产精品| 欧美成人精品三级网站| 亚洲激情偷拍| 日韩欧美在线精品| 成人免费电影网址| 日韩精品一级中文字幕精品视频免费观看 | 伊人成人在线视频| 国产亚洲高清一区| 麻豆国产精品777777在线| 日韩网站中文字幕| 久久中文字幕导航| 丝袜av一区| 国产日韩一区二区三区在线| 久久人人99| 精品久久97| 国产精品中文字幕亚洲欧美 | 国产精品传媒麻豆hd| 亚洲精品一级二级三级| 99香蕉国产精品偷在线观看 | 国产精品av一区二区| 美女网站一区| 日韩精品专区| 伊人久久av| 亚洲v在线看| 99成人在线| 亚洲婷婷丁香| 久久中文字幕导航| 麻豆一区二区三| 日韩国产精品久久久| 综合五月婷婷| 少妇精品在线| 日韩精品免费观看视频| 美国三级日本三级久久99| 久久久久久网| 精品久久中文| 亚洲婷婷在线| 欧美精品国产| 日韩高清一级| 99亚洲视频| 中文一区在线| 久久精品国产大片免费观看| 欧美日一区二区三区在线观看国产免 | 日韩在线一区二区| 黄在线观看免费网站ktv| 国产亚洲高清一区| 欧美激情aⅴ一区二区三区| 国产精品久久久久久久免费软件| 91精品国产自产观看在线| 一二三区精品| 欧美日韩亚洲国产精品| 日韩综合一区二区| 7777精品| 狂野欧美性猛交xxxx| 精品视频91| 久久婷婷激情| 蜜臀精品一区二区三区在线观看| 美国欧美日韩国产在线播放| 免费在线成人网| 国产日韩免费| 亚洲国内精品| 日本少妇精品亚洲第一区| 国产精品一区二区中文字幕| 国产麻豆一区二区三区| 红杏一区二区三区| 国产精品av一区二区| 日欧美一区二区| 国产一区二区三区日韩精品| 久久久国产精品一区二区中文| 好吊日精品视频| 国产精品毛片aⅴ一区二区三区| 色在线视频观看| 综合一区二区三区| 丁香婷婷久久| 亚洲影视一区| 久久av网站| 亚洲免费黄色| 久久99蜜桃| 视频一区视频二区在线观看| 麻豆国产欧美日韩综合精品二区| 久久要要av| 国产极品模特精品一二| 野花国产精品入口| 国际精品欧美精品| 日本不卡视频一二三区| 深夜视频一区二区| 国产乱人伦丫前精品视频| 欧美~级网站不卡| 秋霞影视一区二区三区| 日韩影院精彩在线| 精品成av人一区二区三区| 亚洲影院天堂中文av色| 欧美日韩精品免费观看视欧美高清免费大片| 一区二区三区四区日韩| 99精品视频在线| 久久精品国产精品亚洲毛片| 日韩精品一级二级| 欧美日韩国产亚洲一区| 久久久久久一区二区| 国产精品毛片aⅴ一区二区三区| 视频一区二区不卡| 午夜欧美精品久久久久久久| 国产成人免费| 成午夜精品一区二区三区软件| 91精品尤物| 中文字幕亚洲精品乱码| 国产模特精品视频久久久久| 91精品成人| 国产亚洲亚洲| 日韩精品一二区| 蜜臀久久久99精品久久久久久| 亚洲韩日在线| 欧美日韩国产一区二区三区不卡| 蜜臀国产一区| 亚洲成人二区| 日韩午夜av| 91成人网在线观看| 精品视频一区二区三区四区五区 | 亚洲色图综合|