关于用户权限的数据库设计

更新时间:2024-11-07 13:38:02 阅读: 评论:0


2022年7月20日发
(作者:失踪)

1设计思路

为了设计一套具有较强可扩展性的用户认证管理,需要建立用户、角和权限等数据库表,

并且建立之间的关系,具体实现如下。

1.1用户

用户仅仅是纯粹的用户,用来记录用户相关信息,如用户名、密码等,权限是被分离出去了

的。用户(User)要拥有对某种资源的权限,必须通过角(Role)去关联。

用户通常具有以下属性:

编号,在系统中唯一。

ü名称,在系统中唯一。

ü用户口令。

ü注释,描述用户或角的信息。

1.2角

角是使用权限的基本单位,拥有一定数量的权限,通过角赋予用户权限,通常具有以下

属性:

ü编号,在系统中唯一。

ü名称,在系统中唯一。

ü注释,描述角信息

1.3权限

权限指用户根据角获得对程序某些功能的操作,例如对文件的读、写、

修改和删除功能,通常具有以下属性:

ü编号,在系统中唯一。

ü名称,在系统中唯一。

ü注释,描述权限信息

1.4用户与角的关系

一个用户(User)可以隶属于多个角(Role),一个角组也可拥有多个用户,用户角

就是用来描述他们之间隶属关系的对象。用户(User)通过角(Role)关联所拥有对某种

资源的权限,例如l用户(User):

UserIDUserameUserPwd

1张三xxxxxx

2李四xxxxxx

……

l角(Role):

RoleIDRoleameRoleote

01系统管理员监控系统维护管理员

02监控人员在线监控人员

03调度人员调度工作人员

04一般工作人员工作人员……

从该关系表可以看出,用户所拥有的特定资源可以通过用户角来关联。

1.5权限与角的关系

一个角(Role)可以拥有多个权限(Permission),同样一个权限可分配给多个角。例

如:l角(Role):

RoleIDRoleameRoleote

01系统管理员监控系统维护管理员

02监控人员在线监控人员

03调度人员调度工作人员

04一般工作人员工作人员……

l权限(Permission):

PermissionIDPermissionamePermissionote

0001增加监控允许增加监控对象

0002修改监控允许修改监控对象

0003删除监控允许删除监控对象

0004察看监控信息允许察看监控对象……

l角权限(Role_Permission):

RolePermissionIDRoleIDPermissionIDRolePermissionote

1010001角“系统管理员”具有权限“增加监控”

2010002角“系统管理员”具有权限“修改监控”

3010003角“系统管理员”具有权限“删除监控”

4010004角“系统管理员”具有权限“察看监控”

5020001角“监控人员”具有权限“增加监控”

6020004角“监控人员”具有权限“察看监控”

……

由以上例子中的角权限关系可以看出,角权限可以建立角和权限之

间的对应关系。

1.6建立用户权限

用户权限系统的核心由以下三部分构成:创造权限、分配权限和使用权限。第一步由

Creator创造权限(Permission),Creator在设计和实现系统时会划分。利用存储过程

CreatePermissionInfo(@Permissioname,@Permissionote)创建权限信息,指定系统模块具

有哪些权限。

第二步由系统管理员(Administrator)创建用户和角,并且指定用户角(User-Role)

和角权限(Role-Permission)的关联关系。

1)具有创建用户、修改用户和删除用户的功能:Administrator

l存储过程CreateUserInfo(@Userame,@UserPwd)创建用户信息;

l存储过程ModifyUserInfo(@Userame,@UserPwd)修改用户信息;

l存储过程DeleteUserInfo(@UserID)删除用户信息;

2)具有创建角和删除角

的功能:Administrator

l存储过程CreateRoleInfo(@Roleame,@Roleote)创建角信息;

l存储过程DeleteRoleInfo(@RoleID)删除角信息;

3)Administrator具有建立用户和角、角和权限的关联关系功能:

l存储过程GrantUserRole(@UserID,@RoleID,@UserRoleote)建立用户和角的关联关系;

l存储过程DeleteUserRole(@UserRoleID)删除用户和角的关联关系;

l存储过程GrantRolePermission(@RoleID,@PermissionID,@RolePermissionote)建立角

和权限的关联关系;

l存储过程DeleteRolePermission(@RolePermissionID)删除角和权限的

关联关系;

第三步用户(User)使用Administrator分配给的权限去使用各个系统模块。利用存储过

程GetUserRole(@UserID,@UserRoleIDoutput),GetRolePermission

(@RoleID,@Role--PermissinIDoutput)获得用户对模块的使用权限。

1.7用户认证实现

当用户通过验证后,由系统自动生成一个128位的TicketID保存到用户数据库表中,建

立存储过程Login(@UserID,@UserPwd,@TicketIDoutput)进行用户认证,认证通过得到一

个TicketID,否则TicketID为null。其流程图如下:

图1Login流程图

得到TicketID后,客户端在调用服务端方法时传递TicketID,通过存储过程

JudgeTicketPermission(@TicketID,@PermissionID)判断TicketID对应的用户所具有的权限,

并根据其权限进行方法调用。

当用户退出系统时,建立存储过程Logout(@UserID)来退出系统。当用户异常退出系

统时,根据最后的登陆时间(LastSignTime)确定用户的TickeID,建立存储过程ExceptionLogout

(@UserID,@LastSignTime)处理用户的异常退出。

图2Logout流程图

WebService可以采用SoapHeader中写入TicketID来使得TicketID从客户端传递给服务

端。.etRemoting可以采用CallContext类来实现TicketID从客户端传递给服务端。

2数据库设计2.1数据库表

图3数据库关系图

2.2数据库表说明

2.2.1用户表(Static_User)Static_UserStatic_User

字段名详细解释类型备注

UserID路线编号varchar(20)PK

Userame用户名称varchar(20)

UserPwd用户密码varchar(20)

LastSignTime最后登陆时间datatime

SignState用户登陆状态标记int

TickeID验证票记录编号varchar(128)

2.2.2角表(Static_Role)

Static_RoleStatic_User

字段名详细解释类型备注

RoleID角编号varchar(20)PK

Roleame角名称varchar(20)

Roleote角信息描述varchar(20)

2.2.3用户-角表(Static_User_Role)

Static_User_RoleStatic_User

字段名详细解释类型备注

UserRoleID用户角编号varchar(20)PK

UserID用户编号varchar(20)FK

RoleID角编号varchar(20)FK

UserRoleote用户角信息描述varchar(20)

2.2.4权限表(Static_Permission)

Static_PermissionStatic_User

字段名详细解释类型备注

PermissionID编号varchar(20)PK

Permissioname权限名称varchar(20)

Permissionote全息信息描述varchar(20)

2.2.5角-权限表(Static_Role_Permission)

Static_Role_PermissionStatic_User

字段名详细解释类型备注

RolePermissionID角权限编号varchar(20)PK

RoleID角编号varchar(20)FK

PermissionID权限编号varchar(20)FK

RolePermissionote角权限信息描述varchar(20)

用“位”来存储、修改用户权限的方法

以前我用记录方式,如A用户有3个模块权限,则A有三条记录

看到别人的程序里有这种方法,感觉不错,给大家看看有没有优点可取。

用户权限用一个int字段表示,可以放32位,

如果有第1,3,4模块的权限则,值为148=13

___________________

_userId_____userQx___

A|13

_________|___________

增加权限具体实现

增加第四个模块的权限,4的二进制值8

updateqxUsersetuserQx=userQx|8whereuserId='A'

删除第四个模块的权限

updateqxUsersetuserQx=userQx&~8whereuserId='A'

如果删除第四个模块,则不加条件就可以了

updateqxUsersetuserQx=userQx&~8

以上在SqlServer2000企业版通过。

欢迎大家讨论,有更好的方法大家共享呀~~~

在Java里

34&2!=0就行了。

通过二,三两步的理解,相信这篇文章就不会生涩了!~

首先上文权限设计拙见(1)中只是想记录下自己权限设计上的一点看法,以及将自己日

常最常用的权限解决方案记录下来以供日后回顾,没想到有朋友关注此类的设计,那就只能

先把代码拿出来献丑了,抛砖引玉,大家共同探讨学习

接着上文来说,上文所讨论的权限设计是一条思路,但既然是web应用,少不了数据

库的支持,本文我们来讨论一下数据库的设计。(以下想法及思路仅仅代表本人拙见)

说到权限的数据库设计,必先理清权限中几种实体及其关系,此部分想必有过设计权限

经验的同仁都知道怎么设计了,网上摆渡一下也是一裤衩子一裤衩子的,我们就在最平凡直

观的数据库关系的基础上来建立权限。下面是我的几个表(所有的表都带有一个pk_id,作为

表的自动生成的唯一主键):

用户表(T_UserInfo):

1/*==============================================================*/

2/*Table:T_UserInfo*/

3/*==============================================================*/

4createtableT_UserInfo

5(

6pk_idUMBERnotnull,

7nameVARCHAR2(20),

8sexBOOLEA,

9ageint,

10emp_numUMBER,

11polityint,

12unitVARCHAR2(50),

13departmentVARCHAR2(20),

14specialtyint,

15positionVARCHAR2(10),

16offtelVARCHAR2(20),

17famtelVARCHAR2(20),

18post_stateVARCHAR2(10),

19remarkVARCHAR2(100),

20constraintPK_T_USERIFOprimarykey(pk_id)

21);

实战经验:用户表就不多说了,都是一些常用字段,年龄、电话、职位等,建议大家建

立一个通用一些,字段多一些的一个用户表,便于以后扩展,以后如果有特殊需求,不用扩

这个基本表,可以通过主外键关系来新建一个表,用于扩充字段

角表(T_RoleInfo):

1/*==============================================================*/

2/*Table:T_RoleInfo*/

3/*==============================================================*/

4createtableT_RoleInfo

5(

6pk_idnumbernotnull,

7role_nameVARCHAR2(20),

8role_descVARCHAR2(100),

9parent_role_idUMBER,

10constraintPK_T_ROLEIFOprimarykey(pk_id)

11);

角表中需要说明的就一个parent_role_id父角id,此字段用来扩展角的继承关

系。

资源表(T_ResourceInfo):

1/*==============================================================*/

2/*Table:T_ResourceInfo*/

3/*==============================================================*/

4createtableT_ResourceInfo

5(

6pk_idUMBERnotnull,

7module_nameVARCHAR2(20),

8module_codeVARCHAR2(10),

9module_descVARCHAR2(100),

10privilege_nameVARCHAR2(10),

11privilege_codeCHAR,

12privilege_descVARCHAR2(100),

13constraintPK_T_RESOURCEIFOprimarykey(pk_id)

14);

这个表需要说明的就比较多了,首先该表用来记录资源与资源权限,我这边所谓的资源

就是实体,就是数据库表,角需要对应到资源,有些角对该资源有权限,有些角则对

该资源无权限,角可对此资源操作的权限也不同。说白了,就是不同的角对不同的数据

库表的操作权限不同。因此我们这里的资源就是数据库表。

module_name:资源名;

module_code:资源代码(存放数据库表名);

privilege_name:权限名;

privilege_code:权限代码(代表权限的code,也就是我们上文所说的权值)

例如角a对数据库表T_UserInfo有添加与删除的权限则该表应该按照如下配置:

module_name:人员信息;

module_code:T_UserInfoprivilege_name:添加与删除

privilege_code:6

这里我们假设的是2的0次方为添加权限,2的1次方为添加权限,2的2次方为删除

权限,2的3次方为更新权限,则拥有添加与删除权限就应该为2的1次方+2的2次方=6,

其实2的几次方代表什么含义我们可以另外开个数据库表来配置(或者xml文件)此处我们

忽略这些步骤。当然如果你的权限较多,譬如你还希望a这个角对人员信息表有上传得权

限,我们可以将将上传权限定义为2的4次方,16,16的16进制数为10,记录在数据库

里的形式应该为0x10如果a角拥有添加、删除、更新、上传权限,则a的权值应该为2

的1次方+2的2次方+2的3次方+2的4次方=30,用16进制来表示就应该为0x1E,记录16

进制数据,你不用担心位数不够。剩余的就是几张关系表了:

人员角关系表(T_R_User_Role):

1/*==============================================================*/

2/*Table:T_R_user_role*/

3/*==============================================================*/

4createtableT_R_user_role

5(

6pk_idUMBERnotnull,

7user_idUMBER,

8role_idUMBER,

9constraintPK_T_R_USER_ROLEprimarykey(pk_id)

10);

角资源关系表(T_R_Role_Resource)

1/*==============================================================*/

2/*Table:T_R_role_resource*/

3/*==============================================================*/

4createtableT_R_role_resource

5(

6pk_idUMBERnotnull,

7role_idUMBER,

8res_idUMBER,

9constraintPK_T_R_ROLE_RESOURCEprimarykey(pk_id)

10);

当然如果你不怕麻烦,可以添加进去组(group)、系统(system)、组织(organization),建立

起一套属于你自己的完整的权限解决方案,作为系统无关的模块去套用到每个你所架构的应

用中去,那是一件极爽的事情。


本文发布于:2022-07-20 23:35:43,感谢您对本站的认可!

本文链接:http://www.wtabcd.cn/falv/fa/83/26303.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:法律数据库
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 站长QQ:55-9-10-26