講義第8章授權(quán)階段實戰(zhàn)_第1頁
講義第8章授權(quán)階段實戰(zhàn)_第2頁
講義第8章授權(quán)階段實戰(zhàn)_第3頁
講義第8章授權(quán)階段實戰(zhàn)_第4頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、第8章 授權(quán)(階段實戰(zhàn))學(xué)習(xí)目標(biāo)能夠描述或描繪RBAC模型的7張表及其關(guān)系理解管理員角色設(shè)置的需求與實現(xiàn)思路,完成管理員角色設(shè)置功能理解角色權(quán)限設(shè)置的需求與實現(xiàn)思路,完成角色權(quán)限設(shè)置的功能掌握spring security授權(quán)控制的兩種方式,實現(xiàn)用戶權(quán)限控制的功能理解用戶菜單展示的需求與實現(xiàn)思路,完成用戶菜單展示的功能1. RBAC模型1.1 什么是RBAC權(quán)限系統(tǒng)提的最多的就是 RBAC(Role-Based Access Control 基于角色的訪問控制)。 所謂角色,其實就是權(quán)限的集合,某個角色就是某幾個權(quán)限的結(jié)合。其目的是為 了簡化授權(quán)和鑒權(quán)的過程。首選說一下為什么要進(jìn)行訪問控制。為

2、了屏蔽無關(guān)人員操作系統(tǒng)的某個功能,防止誤操作產(chǎn)生的垃圾數(shù)據(jù)或數(shù)據(jù)丟失。小公司和比較簡單的權(quán)限系統(tǒng)使用的基于用戶的訪問控制如下:這種訪問控制只適用于操作人員比較少的系統(tǒng),如果操作人員較多,對每個操作人員都進(jìn)行授權(quán)操作,無疑是非常繁瑣的。所以我們就需要基于角色的訪問控制1.2 表結(jié)構(gòu)分析企業(yè)開發(fā)中 RBAC模型設(shè)計為7張表,其中4張為基礎(chǔ)表,3張為中間表。1.2.1 用戶與用戶和 為多對多關(guān)系,通過用戶 中間表關(guān)聯(lián)tb_admin 管理員表:tb_role 表:tb_admin_role 管理員 中間表:字段名稱字段含義字段類型字段長度備注ididINT主鍵name名稱VARCHAR字段名稱字段含

3、義字段類型字段長度備注ididINT主鍵login_name登錄名稱VARCHARpasswordstatus狀態(tài)1.2.2 與權(quán)限和權(quán)限為多對多關(guān)系,通過 權(quán)限中間表關(guān)聯(lián)tb_role 表:tb_resource 權(quán)限表( 表):tb_role_resource 中間表:1.2.3 權(quán)限與菜單權(quán)限和菜單為多對多關(guān)系,通過權(quán)限菜單中間表關(guān)聯(lián)tb_resource 權(quán)限表( 表):字段名稱字段含義字段類型字段長度備注role_ididINT主鍵resource_ididINT主鍵字段名稱字段含義字段類型字段長度備注ididINT主鍵res_keykeyVARCHAR系統(tǒng)定義好的權(quán)限標(biāo)識res_n

4、ame名稱VARCHARparent_ididINT權(quán)限表的層次結(jié)構(gòu)為2層字段名稱字段含義字段類型字段長度備注ididINT主鍵name名稱VARCHAR字段名稱字段含義字段類型字段長度備注admin_id管理員idINT主鍵role_ididINT主鍵tb_menu 菜單表:tb_resource_menu 資源菜單中間表:2. 管理員角色設(shè)置2.1 需求分析管理員和角色為多對多關(guān)系,在保存管理員時實現(xiàn)對管理員角色中間表的添加。詳見靜態(tài)原型。字段名稱字段含義字段類型字段長度備注resource_id資源idINT主鍵menu_id菜單idVARCHAR主鍵字段名稱字段含義字段類型字段長度備注

5、ididVARCHAR主鍵name菜單名稱VARCHAR.parent_id上級菜單idVARCHAR菜單表的層次結(jié)構(gòu)為3層字段名稱字段含義字段類型字段長度備注id資源idINT主鍵res_key資源keyVARCHAR系統(tǒng)定義好的權(quán)限標(biāo)識res_name資源名稱VARCHARparent_id上級資源idINT權(quán)限表的層次結(jié)構(gòu)為2層在修改某個管理員時,需要將該管理員的角色id列表讀取出來。2.2 思路分析2.2.1 提交角色設(shè)置(1) 創(chuàng)建管理員角色中間表的實體類和數(shù)據(jù)訪問接口(2) 創(chuàng)建組合實體類,包含管理員實體類和角色I(xiàn)D集合兩個屬性(3) 修改管理員實體類,為id添加以下注解可以標(biāo)識該

6、主鍵為自增 GeneratedValue(strategy=GenerationType.IDENTITY)添加此注解后,可以獲取新增的id值。(4)修改管理員add方法,取出管理員實體保存,取出 ID集合,循環(huán)添加到管理員中間表。(5) 注意在保存管理員 時需要對 進(jìn)行bcrypt加密。(6) 前端可以根據(jù) 架構(gòu)師生成的代碼修改即可。“所屬 ”使用elementui的select選擇器 ,為 elselect 設(shè)置 multiple 屬性即可啟用多選 ,詳見 文檔。2.2.2 設(shè)置(1) 修改findById方法的返回值為組合實體類,修改其中的邏輯,組合實體類的 id集合需要 管理員 中間表

7、。(2) 修改update方法,刪除原來的相關(guān)的中間表數(shù)據(jù),再循環(huán)添加中間表數(shù)據(jù)。(3) 后需要把 屬性設(shè)置為null, 如果用戶沒有在界面輸入 則保持 不變,如果填寫了 需要進(jìn)行bcrypt加密。3. 權(quán)限設(shè)置3.1 需求分析顯示所有的權(quán)限列表,并自動 已經(jīng)保存的權(quán)限。用戶 權(quán)限后,點擊提交,將勾選的權(quán)限id提交給后端保存3.2 思路分析3.2.1 提交權(quán)限設(shè)置(1) 創(chuàng)建 權(quán)限中間表的實體類和數(shù)據(jù) 接口(2) 前后端約定要提交的數(shù)據(jù)格式,包括“ id”和“權(quán)限id列表”。根據(jù)約定的數(shù)據(jù)格式創(chuàng)建組合實體類。(3)后端添加方法,接收組合實體類參數(shù),提取“ id”和“權(quán)限id列表”,循環(huán) 權(quán)限i

8、d 到 權(quán)限中間表中。3.2.2 權(quán)限設(shè)置(1) 后端 權(quán)限表( 表),以樹狀結(jié)構(gòu)返回數(shù)據(jù)。前端使用兩層v-for循環(huán)輸出列表。(2) 后端添加方法,根據(jù) 權(quán)限id列表,前端獲取權(quán)限id列表后實現(xiàn)復(fù)選框的勾選。4. 用戶權(quán)限4.1 需求分析當(dāng)用戶執(zhí)行一個不存在的權(quán)限的url,需要 請求。4.2 spring security4.2.1 基于URL在UserDetailsServiceImpl的loadUserByUsername方法,實現(xiàn)對當(dāng)前用戶的/構(gòu)建權(quán)限列表List<GrantedAuthority> grantedAuths = new ArrayList<Grant

9、edAuthority>(); grantedAuths.add(new SimpleGrantedAuthority("goods_add"); grantedAuths.add(new SimpleGrantedAuthority("goods_edit");.修改applicationContext_security.xmlhasAnyAuthority():擁有任意權(quán)限都可以hasAuthority('brand'): 擁有brand的權(quán)限可以hasAnyAuthority('goods_add','

10、goods_edit')" :擁有g(shù)oods_add和goods_edit其中一個權(quán)限就可以4.2.2 基于方法的對當(dāng)前用戶 ,同上 ,對方法的 如下:(1)修改applicationContext_security.xml ,增加配置 ,啟用注解 <globalmethodsecurity prepostannotations="enabled" />(2)在進(jìn)行權(quán)限 的方法上添加注解 PreAuthorize("hasAuthority('brand')")brand為 key4.3 思路分析(1)編寫S

11、QL語句,通過登錄名 KEY列表這里我們用到了4層嵌套循環(huán)(2)數(shù)據(jù) 接口新增方法,根據(jù)登錄名 KEY列表SELECT res_key FROM tb_resource WHERE id IN (SELECT resource_id FROM tb_role_resource WHERE role_id IN ( SELECT role_id FROM tb_admin_role WHERE admin_id IN (SELECT id FROM tb_admin WHERE login_name='admin')<intercepturl pattern="/

12、*/find*.do" access="hasAnyAuthority()" /><intercepturl pattern="/brand/*.do" access="hasAuthority('brand')" /><intercepturl pattern="/spu/save.do" access="hasAnyAuthority('goods_add','goods_edit')" />(3) 服務(wù)

13、層實現(xiàn)根據(jù)登錄名 KEY列表(4) UserDetailsServiceImpl的loadUserByUsername方法,調(diào)用根據(jù)登錄名KEY列表的方法,將 key列表添加到當(dāng)前用戶。/構(gòu)建權(quán)限列表List<GrantedAuthority> grantedAuths = new ArrayList<GrantedAuthority>(); List<String> resKeyList = resourceService.findResKeyByLoginName(s); for(String resKey :resKeyList )grantedAut

14、hs.add(new SimpleGrantedAuthority(resKey);(5)修改applicationContext_security.xml,添加對url的 ,或在方法上添加注解實現(xiàn)對方法的 。5. 用戶菜單篩選5.1 需求分析用戶登錄后進(jìn)入主界面,顯示的菜單為用戶所擁有的權(quán)限關(guān)聯(lián)的菜單。不具 限的菜單不顯示。5.2 思路分析(1)編寫SQL語句,根據(jù)當(dāng)前登錄名獲取菜單列表的方法SELECT * FROM tb_ WHERE id IN(SELECT _id FROM tb_resource_ WHERE resource_id IN ( SELECT resource_id

15、FROM tb_role_resource WHERE role_id IN (SELECT role_id FROM tb_admin_role WHERE admin_id IN ( SELECT id FROM tb_admin WHERE login_name='admin')注意通過上述語句,獲取的菜單列表只包含三級菜單,而我們需要返回包括一級菜單、 菜單和三級菜單的菜單列表。只要三級菜單存在,就要有它的 菜單;只要有一個 菜單就要有它的一級菜單。菜單列表:SELECT * FROM tb_ WHERE id IN(SELECT parent_id FROM tb_

16、WHERE id IN(SELECT _id FROM tb_resource_ WHERE resource_id IN ( SELECT resource_id FROM tb_role_resource WHERE role_id IN (SELECT role_id FROM tb_admin_role WHERE admin_id IN ( SELECT id FROM tb_admin WHERE login_name='admin')一級菜單列表:SELECT * FROM tb_ WHERE id IN (SELECT parent_id FROM tb_ WH

17、ERE id IN( SELECT parent_id FROM tb_ WHERE id IN(SELECT _id FROM tb_resource_ WHERE resource_id IN ( SELECT resource_id FROM tb_role_resource WHERE role_id IN (SELECT role_id FROM tb_admin_role WHERE admin_id IN ( SELECT id FROM tb_admin WHERE login_name='admin')最后我們通過UNION運算符將三個語句連接成一條語句SEL

18、ECT * FROM tb_ WHERE id IN(SELECT _id FROM tb_resource_ WHERE resource_id IN ( SELECT resource_id FROM tb_role_resource WHERE role_id IN (SELECT role_id FROM tb_admin_role WHERE admin_id IN ( SELECT id FROM tb_admin WHERE login_name='admin') UNIONSELECT * FROM tb_ WHERE id IN(SELECT parent_id FROM tb_ WHERE id IN(SEL

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論