MSSQL的库
设计表:
Users 用户表 字段:userid,username,userpermission
Roles 角色表 字段:roleid,rolename,rolepermission
UserInRole 用户角色对应表 字段:userid,roleid
PermissionList 权限列表 字段:permissionid,permissionDescription,permissionGroup
权限设计:许可、禁止和未设置三种状态,Allow,Deny,Not Set
目标:
实现用户权限的定义。
首先定义角色权限,用户与角色间是多对多的关系。用户权限继承自角色权限。
情况一:用户所属的多个角色存在权限冲突时,取最小权限,即某权限角色A许可,角色B禁止,则该权限为禁止。
情况二:用户所属的角色均未对某权限进行设置时,即NotSet状态,则该权限同DENY
情况三:用户所属的角色对某权限为许可时,也可单独设置该权限为禁止。
功能:
设置用户权限:
默认情况下,用户权限继承自所属角色的权限
可单独设置某用户的权限
扩展权限
权限定义可随时增加,并可以分组。当增加权限时,默认的角色权限均为未设置状态
问题:
1、在MSSQL数据库中如何设置userpermission和rolepermission字段的字段类型?
2、如何存取用户权限?特别是当用户属于多个角色时,如何高效的设置用户权限的问题
网友lidong6(立冬) 回复:
已经很好了,现在很多的权限设计都是这样.不过对于权限表你可以考虑使用了多级.而不只是有一个分组.
网友MyLf(不睡觉的鱼)回复:
对于可单独设置某用户的权限这种情况,你完全可以将这个用户作为一个私有的角色去处理(即Roles表中有个该用户名的角色,该角色只属于这个用户所拥有),这样,你就不必区分是不是用户还是角色,统一都以角色来处理权限问题。
数据表的设计,PermissionList 这个表应该只是定义有哪几种权限,所以应该还有另一张表,存放Permission和Roles的关系的表,比如叫PermissionSetting,其中字段为PermissionId,RoleId.
所以,userpermission,rolepermission这些字段是不需要的。
获取用户权权限,就根据用户和角色的关联,然后在PermissionSetting查找就可以了,不难的。
我自己的回复
我的思路是这样的,以一个用户管理系统为例
permissionlist中数据如下:
permissionid,permissionDescription,permissionGroup
1, AddUser , 用户管理组
2, DelUser , 用户管理组
3, EditUser , 用户管理组
4, AddRole , 角色管理
5, DelRole , 角色管理
6, EditRole , 角色管理
7, AddMember , 角色管理
8, RemoveMember , 角色管理
角色中定义一个账号管理员的角色.这个角色专门用来添加/删除用户的
则其权限为1,2,3许可,其他未设置
另一个角色管理员,权限为4,5,6,7,8为许可,其他未设置.
则
若用户A同时属于两个角色时,则拥有全部权限
我原来的想法是设置userpermission为binary字段,存取长的二进制数.权限可按位取.
如账号管理员的角色权限值为11100000,
角色管理员的角色权限值为00011111,
则用户A的权限为两个角色的按位进行或运算的值为11111111.
但编程实现起来好像很不方便.
而且存成binary字段的话,要将长串0101的字符做为二进制数存进SQL数据库,好像实现起来也不那么容易.因为要将0101的字符串转为int型,大点也就是bigint型,受其大小限制,01字符串的长度不可能超过30位.也就是权限定义不超过30个.所以不知道怎么搞了.
再则,当用户所属的角色过多时,或运算量就可能会比较大,可能会影响程序性能.当然,用户权限在继承自角色权限时,就只运行一次或运算,之后将其权限值存入userpermission中,这样或许会加强一点点性能.
参考:
关于RBAC权限系统的资源定义
http://forum.javaeye.com/viewtopic.php?t=15953&sid=7cc2af0d4ba7bc79461d5bf4d4a96e7f