扩展RBAC用户角色权限设计方案RBAC (Role-Based Access Control ,基于角色的访问控制),就是用户通过角色与权限进行关联。
简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。
这样,就构造成“用户-角色-权限”的授权模型。
在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系。
(如下图)角色是什么?可以理解为一定数量的权限的集合,权限的载体。
例如:一个论坛系统,“超级管理员”、“版主”都是角色。
版主可 管理版内的帖子、可管理版内的用户等,这些是权限。
要给某个用户授予这些权限,不需要直接将权限授予用户,可将“版主”这个 角色赋予该用户。
当用户的数量非常大时,要给系统每个用户逐一授权(授角色),是件非常烦琐的事情。
这时,就需要给用户分组,每个用户组内有 多个用用户表用户ID範加刖<Ek>用户名 VAKCJUJG GO)角邑表疣Jg KU ■郦行恳律邑朽VABOW^O)权眼表用戶角色吴说 用/Tnf NUM 血氏 <riti> 宦色m MUMPER <fls2>权限捺识VARCKAR2(5O)户。
除了可给用户授权外,还可以给用户组授权。
这样一来,用户拥有的所有权限,就是用户个人拥有的权限与该用户所在用户组拥有的权限之和。
(下图为用户组、用户与角色三者的关联关系)用户亀用,口?血IF用尸廻名称 则G01 敦用户绢茗称imiEEH用尸角色关联表SPTB mBER <£kl> 角色IE ™0EIt <£k2>用户组TD2 MJWBER <£kt> 用FID2 HUMBER <fl£>]甬户蛆帽色关联炭 用尸注D IBIBER 甬色IDmWER <fl£>FK 瀏 EEF USn用戶表^.PlD 利町四<ifc>fflPa ¥血诙应伽]箱 felD NW 耶yk ;隹色客 mCHkR2UU JFK UE EEf SOLE用户鉅与用户关朕表 y.rK_SR_ta_CRDUF角色董FK_UR_USER【閘;可人甲户朗)在应用系统中,权限表现成什么?对功能模块的操作,对上传文件的删改,菜单的访问,甚至页面上某个按钮、某个图片的可见性控-角色制,都可属于权限的范畴。
有些权限设计,会把功能操作作为一类,而把文件、菜单、页面元素等作为另一类,这样构成“用户-权限-资源”的授权模型。
而在做数据表建模时,可把功能操作和资源统一管理,也就是都直接与权限表进行关联,这样可能更具便捷性和易扩展性。
(见下图)FK_PO_REF PRIVILEGE ---■ FK Pt)-v枷艮操作关联叢 Wfcr TOBEB <£ki> 操作ID OMBEK <fk2?(图:权限分类)请留意权限表中有一列“权限类型”,我们根据它的取值来区分是哪一类权限,如“ MENU ”表示菜单的访问权限、“ OPERATION ”菓单衰魂单迎 mm東单若称 北菜輒DVAKCKAB2「:汩] 饰■&咼昭W) miMEEJl页面芫素贡页辰素IE WBEE页面元亲编码VKRCHAR2 (50)文件表文问 N 血關 为Q 文件名 VARJCHXR2 (50) 广件路栓YAREW^ (60)FK_FE_琲卩 ELENEHT权限页面元素关联表柳BID HUMBER <fk2> 菜单ID HUMEER <fkl>MBER <flc£>页面元素ID HUMBfR <fkl>权卩融件关联表 权跟CD ITUMBER <fkl.>MBEB <£h2>\ /FK_T 阳邸产FRIVI 嘶四E_E£F/FEIYi 跑搭」^玄缸皿忌建■'- r /\T祝跟表:pk 「取關类型 VARCHAR2(50)功能按作表凜㈣ 摻作鏑玛 拦giVPlH 缀 賃蝶ItCD阳輕鈕》V^:HkE2 15JJYOCmB2GO)VOCHW12 (SC )msEK板限萊単关联表 F FILEEF L ATIOII表示功能模块的操作权限、“ FILE'表示文件的修改权限、“ ELEMENT'表示页面元素的可见性控制等。
这样设计的好处有二。
其一,不需要区分哪些是权限操作,哪些是资源,(实际上,有时候也不好区分,如菜单,把它理解为资源呢还是功能模块权限呢?)。
其二,方便扩展,当系统要对新的东西进行权限控制时,我只需要建立一个新的关联表“权限XX关联表”,并确定这类权限的权限类型字符串。
这里要注意的是,权限表与权限菜单关联表、权限菜单关联表与菜单表都是一对一的关系。
(文件、页面权限点、功能操作等同理)。
也就是每添加一个菜单,就得同时往这三个表中各插入一条记录。
这样,可以不需要权限菜单关联表,让权限表与菜单表直接关联,此时,须在权限表中新增一列用来保存菜单的ID,权限表通过“权限类型”和这个ID来区分是种类型下的哪条记录。
到这里,RBAC权限模型的扩展模型的完整设计图如下:用尸組IWBEJ <Dk>用尸朗居称交用尸爼名称VAICHAS2 ③时NUWBEE粟单表吗戶嵋与用戶关联衰用户组I疋ffUMBEE <fkl> 用PIB2 NUMBEE <£!£>用户舉用尸]:D HUMEO 用户名YABCKAK2 (30}.USER魁暫D 菠車容称英单血父菜車DHTOEF mCHAE2C30) raciwcBoiwm贡面无索ID 阿仍ER <pk》页面元素編码¥AECHAf送吁口DUMBER文■井IU lfWER <pk>文件名VABCHAK2i50)文件蹄径VAFCHAR2 (80)GEDUF用户姐龟色关離恚根限棄单其联養FK PE EI2MEHT FK PF FILE权限丈件来联表用户纽 D HUMBER <fkl> 術色JD HWEER <£k2>按眼ID NUMBER <fk£> 萊单ID NUMBER <fkl>权取ID 1RHBEE <fk£> 贡面元索ID NIMBER <£kl>枷B ID SRJNBER<fki> 立f竝D HUMBER <Ek2>箱色恚/ /F^Rivnffi&ff,E_REF^_PRiyf^?~EtEr护巩口尿毎切职喷ER Gk>毎冃名VAECHAB2(30)fK_RF_ftEF.用尸角色天联表ffiRn MBER <£kl> 角色IDNUMBER <fk2>.KOLE FK RF EET嵌限表权BRjD HUMBER <pk>权跟类型VABCKAE2(50)PRIVILEGE FK_F「AkRinLEOEFK PO<图:RBM权限模型扩展)為fclD燥作名秫操作骗码拦截VBL前竦父操恒!)HUMBER <vk>VARCHKR2 (SCOmcmzGajVAKCHXB2 (80)HUMBER杈R 曲:D NUMBER <£kl>操伯D NUMBER <£k2>随着系统的日益庞大,为了方便管理,可引入角色组对角色进行分类管理,跟用户组不同,角色组不参与授权。
例如:某电网系统的权限管理模块中,角色就是挂在区局下,而区局在这里可当作角色组,它不参于权限分配。
另外,为方便上面各主表自身的管理与查找,可采用树型结构,如菜单树、功能树等,当然这些可不需要参于权限分配。
以上,是从基本的RBAC模型进行了扩展,具体的设计要根据项目业务的需要作调整。
欢迎大家提出批评意见!这是我后面加的:具体实现的话,可通过表的关联查询得到,根据用户ID查询到它拥有的角色,再通过角色查询到它所拥有的权限。
例如,查询某个用户所有授权的菜单: select m.* from menu mwhere exists (select 'X' from privilege_me nu pm, privilegee p where pm.privilege_id = p.privilege」dand p.privilege_type = 'MENU'and pm.me nu」d = m.me nu」dand exists(select Xfrom role_privilege rpwhere rp.privilege_id = pm.privilege _idand exists (select 'X'from user_role urwhere ur.role_id = rp.role_idand er_id = ?)))其它的类似,在用户登录到系统中,将这些信息查询一次,加载到内存中就行。