一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

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

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

服務(wù)器之家 - 編程語言 - Java教程 - Spring Security 中細化權(quán)限粒度的方法

Spring Security 中細化權(quán)限粒度的方法

2020-09-19 15:51_江南一點雨 Java教程

這篇文章主要介紹了Spring Security 中細化權(quán)限粒度的方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

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

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

1.權(quán)限管理模型

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

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

1.1 ACL

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

它的原理是這樣:

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

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

1.2 RBAC

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

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

1.3 其他

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

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

2.ACL

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

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

舉個簡單例子:

現(xiàn)在有一個 User 對象,針對該對象有查詢、修改、刪除等權(quán)限,可以將這些權(quán)限賦值給某一個用戶,也可以將這些權(quán)限賦值給某一個角色,當(dāng)用戶具備這些角色時就具有執(zhí)行相應(yīng)操作的權(quán)限。

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

2.1 核心概念

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

Sid

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

?
1
2
3
4
5
6
7
8
9
10
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 大家可以簡單理解為當(dāng)前用戶的權(quán)限(這個說法不是很準(zhǔn)確,可以近似理解)。

ObjectIdentity

ObjectIdentity 是一個域?qū)ο螅@是官方的說法,有點拗口。實際上這就是你要操作的對象。

例如我有一個 User 對象,如果直接去記錄能夠?qū)?User 對象執(zhí)行哪些操作,這就會導(dǎo)致高耦和。所以我們需要對其解耦,將所有需要操作的對象通過 ObjectIdentity 描述出來,這樣就能確保權(quán)限系統(tǒng)不和具體的業(yè)務(wù)綁定。

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

Acl

看名字就知道,這算是整個系統(tǒng)的核心調(diào)度部分。

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

AccessControlEntry

AccessControlEntry 簡寫為 ACE,一個 AccessControlEntry 對象代表一條權(quán)限記錄。每一個 AccessControlEntry 都對應(yīng)了一個 Acl,一個 Acl 對象對應(yīng)多個 AccessControlEntry,有了這層對應(yīng)關(guān)系,相當(dāng)于就知道這個權(quán)限操作的是哪個對象。

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

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

Permission

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

Spring Security 種默認定義了五種

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class BasePermission extends AbstractPermission {
    public static final Permission READ = new BasePermission(1 << 0, 'R'); // 1
    public static final Permission WRITE = new BasePermission(1 << 1, 'W'); // 2
    public static final Permission CREATE = new BasePermission(1 << 2, 'C'); // 4
    public static final Permission DELETE = new BasePermission(1 << 3, 'D'); // 8
    public static final Permission ADMINISTRATION = new BasePermission(1 << 4, 'A'); // 16
 
    protected BasePermission(int mask) {
        super(mask);
    }
 
    protected BasePermission(int mask, char code) {
        super(mask, code);
    }
}

 AclService

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

AclService 主要有兩類實現(xiàn)接口:

  • JdbcAclService
  • JdbcMutableAclService

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

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

2.2 Acl 數(shù)據(jù)表

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

Spring Security 中細化權(quán)限粒度的方法

可以看到,針對不同類型的數(shù)據(jù)庫,都有對應(yīng)的腳本。

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

acl_class

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

Spring Security 中細化權(quán)限粒度的方法

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

acl_sid

acl_sid 表用來保存 Sid 的。

Spring Security 中細化權(quán)限粒度的方法

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

acl_object_identity

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

Spring Security 中細化權(quán)限粒度的方法

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

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

acl_entry

這個表單純看數(shù)據(jù),一堆數(shù)字。

Spring Security 中細化權(quán)限粒度的方法

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

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

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

3.小結(jié)

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

參考資料:

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

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

到此這篇關(guān)于Spring Security 中細化權(quán)限粒度的方法的文章就介紹到這了,更多相關(guān)Spring Security 細化權(quán)限粒度內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://blog.csdn.net/u012702547/article/details/108614996

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 四虎影音| 亚洲精品第一国产综合高清 | videojapan日本孕交孕 | 公交车高h | 明星ai智能人脸替换造梦在线播放 | 国产精品第1页在线播放 | 国产精品一区二区国产 | 久久亚洲电影www电影网 | 精品视频一区二区三区免费 | 国产精品高清视亚洲一区二区 | 欧美大片一区二区三区 | 169pp美女 | 欧美艳星kagney1ynn | 女同色图 | 国产福利在线观看91精品 | 国产在线精品成人一区二区三区 | 亚洲免费高清视频 | 免费看美女被靠到爽的视频 | 国产免费久久精品 | 美日韩一区二区三区 | 草莓视频在线免费观看 | 国模孕妇季玥全部人体写真 | 精品亚洲综合在线第一区 | 日本人成在线视频免费播放 | 国产精品麻豆 | 91庥豆果冻天美精东蜜桃传媒 | 日韩精品欧美 | 亚洲午夜久久久久影院 | 免费人成网址在线观看国内 | 肉宠文很肉到处做1v1 | 免费一级国产生活片 | 国产成人精品在线观看 | 久久免费看少妇级毛片蜜臀 | 极品手交handjobtattoo | 无遮挡免费h肉动漫在线观看 | 日日射视频 | 欧美三级小说 | 极品美女穴| 国产精品午夜久久 | 美国美女hd18| 国产极品美女在线 |