Spring Security的角色roles是什么?這篇文章從源碼出發(fā),詳細(xì)解析了Spring Security的角色roles,感興趣的小伙伴們可以參考借鑒,希望對(duì)大家有所幫助。
我們?cè)谶M(jìn)行角色權(quán)限控制設(shè)計(jì)時(shí),一般包括賬戶(users)、角色(roles)、權(quán)限(authorities)這三部分。
1)一個(gè)賬戶一般對(duì)應(yīng)一個(gè)或多個(gè)角色;
2)一個(gè)角色對(duì)應(yīng)多個(gè)權(quán)限(authorities),反過(guò)來(lái)一個(gè)權(quán)限也對(duì)應(yīng)多個(gè)角色;
3)賬戶只和角色關(guān)聯(lián),通過(guò)角色,間接和權(quán)限產(chǎn)生關(guān)系;
4)角色不是固定死的,是能夠動(dòng)態(tài)創(chuàng)建的,每個(gè)角色具有的權(quán)限能夠靈活的進(jìn)行調(diào)整;
5)在系統(tǒng)完成詳細(xì)設(shè)計(jì)后,有哪些權(quán)限就已經(jīng)確定下來(lái),權(quán)限的層級(jí)結(jié)構(gòu)和數(shù)量、與賬戶和角色沒(méi)半點(diǎn)關(guān)系。
基于以上的說(shuō)明,我們從源碼的角度來(lái)說(shuō)明Spring Security的賬戶、角色和權(quán)限是怎么一回事。
Spring Security工作流程:通過(guò)登錄的賬戶,找到該賬戶對(duì)應(yīng)的角色/權(quán)限,并把自定義的權(quán)限集合轉(zhuǎn)換為Spring Security認(rèn)可的權(quán)限集合List<GrantedAuthority>,然后結(jié)合自定義的賬號(hào)、密碼,和新權(quán)限集合這三個(gè)參數(shù),創(chuàng)建一個(gè)Spring Security認(rèn)可的賬號(hào)實(shí)例,再然后根據(jù)自定義的鑒權(quán)規(guī)則,進(jìn)行權(quán)限控制。
這里面如何創(chuàng)建賬號(hào)、角色、權(quán)限,實(shí)現(xiàn)用戶認(rèn)證、進(jìn)行鑒權(quán)的細(xì)節(jié)就不講了,因?yàn)檫@個(gè)不是本篇文章的重點(diǎn),有興趣的讀者可以看我的視頻介紹:https://edu.51cto.com/course/21185.html ,里面有詳細(xì)的如何進(jìn)行實(shí)戰(zhàn)型的Spring Security角色權(quán)限控制模塊的開發(fā)。
重點(diǎn)來(lái)了,通過(guò)應(yīng)用角色權(quán)限控制的應(yīng)用,看Spring Security如何利用角色和權(quán)限的
四種鑒權(quán)的方式:
hasRole(String role)
hasAnyRole(String... roles)
hasAuthority(String authority)
hasAnyAuthority(String... authorities)
在源碼類SecurityExpressionRoot.java中,我們看看這四種方式的實(shí)現(xiàn)形式:
大家從上面的圖看出什么端倪沒(méi)有?
hasRole(String role) --》 hasAnyRole(String... roles) --》hasAnyAuthorityName
hasAuthority(String authority) --》hasAnyAuthority(String... authorities) --》hasAnyAuthorityName
不管是基于角色,還是基于權(quán)限,最后鑒權(quán)都落實(shí)到hasAnyAuthorityName這個(gè)方法上。
follow me,我們繼續(xù)往下刨根,看看hasAnyAuthorityName這個(gè)方法里面有些什么,注意上面代碼中的調(diào)用hasAnyAuthorityName時(shí),傳遞的參數(shù),一個(gè)是
另外一個(gè)是
對(duì)應(yīng)的都是一個(gè)實(shí)現(xiàn)方法。
從hasAnyAuthorityName這個(gè)方法中,我們可以知道,這是把傳進(jìn)去的一個(gè)或多個(gè)角色/權(quán)限,在登錄用戶具有的權(quán)限中進(jìn)行查找
這里面的大家看到了吧,角色和權(quán)限是混合在一起進(jìn)行鑒權(quán)的(題外話,大家看大神們寫的代碼,注意到其中的var5、var6、var4,這是搞什么?嚴(yán)重不符合命名規(guī)范?。?。
那么Spring Security是如何區(qū)分集合中的是權(quán)限、還是角色呢,我們繼續(xù)抽絲剝繭,看看該方法中的getRoleWithDefaultPrefix(prefix, role)方法
看上面的代碼清晰明了了吧,說(shuō)明如下:
如果傳進(jìn)去的角色名稱/權(quán)限名稱為null,直接返回null;
如果傳進(jìn)去的角色名稱/權(quán)限名稱不為null,則判斷defaultRolePrefix前綴這個(gè)參數(shù)是否為空和其長(zhǎng)度,如果不為空,且長(zhǎng)度不為0,則傳進(jìn)的參數(shù)為角色名稱,那么繼續(xù)判斷其是否是以“ROLE”開始,如果不是,則在名稱前添加前綴“ROLE”,并返回新的名稱;
如果不是以上情況,即參數(shù)是權(quán)限名稱或者帶有“ROLE_”前綴的角色名稱,直接返回傳進(jìn)去的字符串參數(shù)。
看了以上的部分源碼解析,我們可以得出什么結(jié)論呢(以角色、權(quán)限存放在數(shù)據(jù)庫(kù)為例):
1、原生的角色和權(quán)限并沒(méi)有本質(zhì)的區(qū)別,在鑒權(quán)時(shí)走的是完全相同的一個(gè)通道;
2、在進(jìn)行權(quán)限控制時(shí),角色可加可不加“ROLE”前綴,但在數(shù)據(jù)庫(kù)中定義時(shí),角色名稱一定要添加“ROLE”前綴;
3、角色與權(quán)限之間并沒(méi)有建立映射關(guān)系,角色是角色、權(quán)限是權(quán)限,這與我們實(shí)際應(yīng)用中對(duì)角色的要求有很大出入;
4、實(shí)際應(yīng)用中的角色被固化到代碼中,也與實(shí)際要求不符,實(shí)際應(yīng)用中,權(quán)限作為子節(jié)點(diǎn)可以寫死,而角色作為全部或者部分權(quán)限的集合應(yīng)該可以靈活調(diào)整;
5、不管是角色鑒權(quán),還是權(quán)限鑒權(quán),都只是以角色/權(quán)限的名稱作為判斷依據(jù),所以權(quán)限的名稱要唯一。
另外,從Spring Security的源碼分析中可以發(fā)現(xiàn),我們還可以通過(guò)RoleHierarchy進(jìn)行角色的繼承(默認(rèn)admin登錄只能訪問(wèn)/admin,訪問(wèn)不了/user;而user登錄只能訪問(wèn)/user),但在實(shí)際項(xiàng)目中,最主要強(qiáng)調(diào)的是角色的靈活性,而不是繼承性。
所以,對(duì)角色的管理、角色和權(quán)限的映射關(guān)系,都需要我們自己來(lái)實(shí)現(xiàn)。
看完上述內(nèi)容,你們對(duì)Spring Security的角色有進(jìn)一步的了解嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
文章名稱:SpringSecurity的角色roles是什么-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)路徑:http://jinyejixie.com/article32/jsgsc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、搜索引擎優(yōu)化、移動(dòng)網(wǎng)站建設(shè)、定制網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)公司、網(wǎng)站營(yíng)銷
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容