您好,登錄后才能下訂單哦!
Spring Security的角色roles是什么?這篇文章從源碼出發,詳細解析了Spring Security的角色roles,感興趣的小伙伴們可以參考借鑒,希望對大家有所幫助。
我們在進行角色權限控制設計時,一般包括賬戶(users)、角色(roles)、權限(authorities)這三部分。
1)一個賬戶一般對應一個或多個角色;
2)一個角色對應多個權限(authorities),反過來一個權限也對應多個角色;
3)賬戶只和角色關聯,通過角色,間接和權限產生關系;
4)角色不是固定死的,是能夠動態創建的,每個角色具有的權限能夠靈活的進行調整;
5)在系統完成詳細設計后,有哪些權限就已經確定下來,權限的層級結構和數量、與賬戶和角色沒半點關系。
基于以上的說明,我們從源碼的角度來說明Spring Security的賬戶、角色和權限是怎么一回事。
Spring Security工作流程:通過登錄的賬戶,找到該賬戶對應的角色/權限,并把自定義的權限集合轉換為Spring Security認可的權限集合List<GrantedAuthority>,然后結合自定義的賬號、密碼,和新權限集合這三個參數,創建一個Spring Security認可的賬號實例,再然后根據自定義的鑒權規則,進行權限控制。
這里面如何創建賬號、角色、權限,實現用戶認證、進行鑒權的細節就不講了,因為這個不是本篇文章的重點,有興趣的讀者可以看我的視頻介紹:https://edu.51cto.com/course/21185.html ,里面有詳細的如何進行實戰型的Spring Security角色權限控制模塊的開發。
重點來了,通過應用角色權限控制的應用,看Spring Security如何利用角色和權限的
四種鑒權的方式:
hasRole(String role)
hasAnyRole(String... roles)
hasAuthority(String authority)
hasAnyAuthority(String... authorities)
在源碼類SecurityExpressionRoot.java中,我們看看這四種方式的實現形式:
大家從上面的圖看出什么端倪沒有?
hasRole(String role) --》 hasAnyRole(String... roles) --》hasAnyAuthorityName
hasAuthority(String authority) --》hasAnyAuthority(String... authorities) --》hasAnyAuthorityName
不管是基于角色,還是基于權限,最后鑒權都落實到hasAnyAuthorityName這個方法上。
follow me,我們繼續往下刨根,看看hasAnyAuthorityName這個方法里面有些什么,注意上面代碼中的調用hasAnyAuthorityName時,傳遞的參數,一個是
另外一個是
對應的都是一個實現方法。
從hasAnyAuthorityName這個方法中,我們可以知道,這是把傳進去的一個或多個角色/權限,在登錄用戶具有的權限中進行查找
這里面的大家看到了吧,角色和權限是混合在一起進行鑒權的(題外話,大家看大神們寫的代碼,注意到其中的var5、var6、var4,這是搞什么?嚴重不符合命名規范啊)。
那么Spring Security是如何區分集合中的是權限、還是角色呢,我們繼續抽絲剝繭,看看該方法中的getRoleWithDefaultPrefix(prefix, role)方法
看上面的代碼清晰明了了吧,說明如下:
如果傳進去的角色名稱/權限名稱為null,直接返回null;
如果傳進去的角色名稱/權限名稱不為null,則判斷defaultRolePrefix前綴這個參數是否為空和其長度,如果不為空,且長度不為0,則傳進的參數為角色名稱,那么繼續判斷其是否是以“ROLE”開始,如果不是,則在名稱前添加前綴“ROLE”,并返回新的名稱;
如果不是以上情況,即參數是權限名稱或者帶有“ROLE_”前綴的角色名稱,直接返回傳進去的字符串參數。
看了以上的部分源碼解析,我們可以得出什么結論呢(以角色、權限存放在數據庫為例):
1、原生的角色和權限并沒有本質的區別,在鑒權時走的是完全相同的一個通道;
2、在進行權限控制時,角色可加可不加“ROLE”前綴,但在數據庫中定義時,角色名稱一定要添加“ROLE”前綴;
3、角色與權限之間并沒有建立映射關系,角色是角色、權限是權限,這與我們實際應用中對角色的要求有很大出入;
4、實際應用中的角色被固化到代碼中,也與實際要求不符,實際應用中,權限作為子節點可以寫死,而角色作為全部或者部分權限的集合應該可以靈活調整;
5、不管是角色鑒權,還是權限鑒權,都只是以角色/權限的名稱作為判斷依據,所以權限的名稱要唯一。
另外,從Spring Security的源碼分析中可以發現,我們還可以通過RoleHierarchy進行角色的繼承(默認admin登錄只能訪問/admin,訪問不了/user;而user登錄只能訪問/user),但在實際項目中,最主要強調的是角色的靈活性,而不是繼承性。
所以,對角色的管理、角色和權限的映射關系,都需要我們自己來實現。
看完上述內容,你們對Spring Security的角色有進一步的了解嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。