RBAC基于角色的權(quán)限管理--設(shè)計篇1.0

RBAC基于角色的權(quán)限管理--設(shè)計篇1.0

RBAC是什么

基于角色的權(quán)限管理。簡單來說就是一個用戶可以擁有若干個角色,一個角色可以擁有若干個權(quán)限。這樣就形成了“用戶-角色-權(quán)限”的模型。

基礎(chǔ)表設(shè)計

數(shù)據(jù)庫采用MySql

這里表設(shè)計只采用最基礎(chǔ)的字段

忽略字段長度,如采用此設(shè)計,請自行修改

忽略外鍵建設(shè),如采用此設(shè)計,請自行建立

用戶表

CREATETABLE`t_user`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'主鍵ID',`create_time`datetimeDEFAULTNULLCOMMENT'創(chuàng)建時間',`create_user`datetimeDEFAULTNULLCOMMENT'創(chuàng)建人',`login_time`datetimeDEFAULTNULLCOMMENT'登錄時間',`name`varchar(255)DEFAULTNULLCOMMENT'用戶名稱',`password`varchar(255)DEFAULTNULLCOMMENT'登錄密碼',`remark`varchar(255)DEFAULTNULLCOMMENT'備注',`status`int(11)DEFAULTNULLCOMMENT'用戶狀態(tài)',`update_time`datetimeDEFAULTNULLCOMMENT'更新時間',`update_user`datetimeDEFAULTNULLCOMMENT'更新人員',`username`varchar(255)DEFAULTNULLCOMMENT'登錄名稱',? PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8;

角色表

CREATETABLE`t_role`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'角色id',
`role_name`varchar(255)DEFAULTNULLCOMMENT'角色名稱',`remark`varchar(255)DEFAULTNULLCOMMENT'備注',? PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8;

權(quán)限表

CREATETABLE`t_permission`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'權(quán)限ID',`permission_code`varchar(255)DEFAULTNULLCOMMENT'權(quán)限編碼',`permission_name`varchar(255)DEFAULTNULLCOMMENT'權(quán)限名稱',`pid`int(11)DEFAULTNULLCOMMENT'父類權(quán)限ID(依賴權(quán)限)',? PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8;

用戶角色關(guān)系表

CREATETABLE`t_user_role`(`user_id`int(11)NOTNULLCOMMENT'用戶id',`role_id`int(11)NOTNULLCOMMENT'角色id',? PRIMARYKEY(`user_id`,`role_id`))ENGINE=InnoDBDEFAULTCHARSET=utf8;

角色權(quán)限關(guān)系表

CREATETABLE`t_role_permission`(`role_id`int(11)NOTNULLCOMMENT'角色id',`permission_id`int(11)NOTNULLCOMMENT'權(quán)限id',? PRIMARYKEY(`role_id`,`permission_id`))ENGINE=InnoDBDEFAULTCHARSET=utf8;

權(quán)限控制

控制菜單

場景

管理員和普通會員。如管理員可以看到所有菜單,普通會員只能看到一部分菜單(或可以看到,但點(diǎn)擊時彈出沒有權(quán)限操作的提示。由于個人喜好和個人體驗(yàn)度偏差的原因,此文章中不采取這種方式)。

問題來了,如何控制角色的菜單權(quán)限?let‘s go!??!

表設(shè)計

CREATETABLE`t_menu`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'主鍵ID',`menu_name`varchar(255)DEFAULTNULLCOMMENT'菜單名稱',`permission_code`varchar(255)DEFAULTNULLCOMMENT'權(quán)限編碼(菜單編碼)',`pid`int(11)DEFAULTNULLCOMMENT'父菜單id',`url`varchar(255)DEFAULTNULLCOMMENT'菜單url跳轉(zhuǎn)鏈接',? PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8;

簡要業(yè)務(wù)流程圖

詳細(xì)業(yè)務(wù)流程圖

控制按鈕

場景

擁有了菜單權(quán)限,依舊不能滿足某些場景的需要。例如多個角色在同時擁有A菜單的情況下,角色1可以有查詢,創(chuàng)建的權(quán)限,角色2則擁有查詢,創(chuàng)建,修改,刪除的權(quán)限。即角色1只能看到查詢,創(chuàng)建的按鈕,角色2可以看到查詢,創(chuàng)建,修改,刪除的按鈕。這個時候,我們應(yīng)該如何處理呢?

實(shí)現(xiàn)

按鈕權(quán)限定義:在菜單權(quán)限下定義下級權(quán)限查詢,創(chuàng)建,修改,刪除,例如Aquery,Aadd,Aupdate,Adelete。

這里結(jié)合shiro使用(不會使用的小伙伴請留言,后期補(bǔ)上解決方式):在A菜單跳轉(zhuǎn)的頁面中使用shiro:hasPermission則可以達(dá)到控制按鈕的效果。例如

新建

詳細(xì)業(yè)務(wù)流程圖(結(jié)合shiro)

代碼示例(思想很重要)

檢查用戶是否有菜單權(quán)限

/**

* 檢查用戶是否有菜單權(quán)限

*

* @param menus

*? ? ? ? ? ? 所有菜單

* @param subject

*? ? ? ? ? ? shiro用戶信息

* @return 用戶已分配的菜單集合

*/privateList check(List menus, Subject subject) {List res =newArrayList();for(Menu m1 : menus) {if(StringUtils.isEmpty(m1.getPermissionCode())) {continue;}// 這里會觸發(fā)鑒權(quán)操作if(subject.isPermitted(m1.getPermissionCode())) {res.add(m1);}}returnres;}

自定義realm-鑒權(quán)操作

@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {// 查詢當(dāng)前用戶所有權(quán)限List infos = userService.findMyPermitions();// 權(quán)限集合(這里我習(xí)慣把權(quán)限編碼放進(jìn)去)Set permissions =newHashSet();// 角色集合(這里放角色I(xiàn)D)Set roles =newHashSet();if(infos !=null&& infos.size() >0) {for(Permission info : infos) {permissions.add(info.getPermissionCode());roles.add(info.getRoleId());}}SimpleAuthorizationInfo authorizationInfo =newSimpleAuthorizationInfo();authorizationInfo.setStringPermissions(permissions);authorizationInfo.setRoles(roles);returnauthorizationInfo;}

數(shù)據(jù)權(quán)限

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容