91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Security的角色roles是什么

發布時間:2020-06-04 16:25:35 來源:億速云 閱讀:1459 作者:Leah 欄目:軟件技術

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中,我們看看這四種方式的實現形式:
Spring Security的角色roles是什么
大家從上面的圖看出什么端倪沒有?  
        hasRole(String role)  --》 hasAnyRole(String... roles)  --》hasAnyAuthorityName
        hasAuthority(String authority)  --》hasAnyAuthority(String... authorities)  --》hasAnyAuthorityName
不管是基于角色,還是基于權限,最后鑒權都落實到hasAnyAuthorityName這個方法上。

        follow me,我們繼續往下刨根,看看hasAnyAuthorityName這個方法里面有些什么,注意上面代碼中的調用hasAnyAuthorityName時,傳遞的參數,一個是
Spring Security的角色roles是什么  
另外一個是
Spring Security的角色roles是什么  
對應的都是一個實現方法。

從hasAnyAuthorityName這個方法中,我們可以知道,這是把傳進去的一個或多個角色/權限,在登錄用戶具有的權限中進行查找  
Spring Security的角色roles是什么  
        這里面的大家看到了吧,角色和權限是混合在一起進行鑒權的(題外話,大家看大神們寫的代碼,注意到其中的var5、var6、var4,這是搞什么?嚴重不符合命名規范啊)。
那么Spring Security是如何區分集合中的是權限、還是角色呢,我們繼續抽絲剝繭,看看該方法中的getRoleWithDefaultPrefix(prefix, role)方法  
Spring Security的角色roles是什么  
Spring Security的角色roles是什么  
看上面的代碼清晰明了了吧,說明如下:
        如果傳進去的角色名稱/權限名稱為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的角色有進一步的了解嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

长顺县| 双辽市| 永德县| 武乡县| 绵竹市| 镇安县| 洛宁县| 谷城县| 金山区| 慈溪市| 万全县| 德阳市| 泽库县| 定日县| 阆中市| 桃江县| 濮阳市| 新郑市| 衡山县| 牙克石市| 红安县| 新龙县| 南投县| 抚顺市| 崇阳县| 垫江县| 桐梓县| 兴山县| 宁都县| 新巴尔虎左旗| 金塔县| 巴塘县| 于都县| 柳林县| 榕江县| 广水市| 丰原市| 文成县| 明星| 德州市| 尉犁县|