多系统权限设计
1. 多系统基于角色的权限设计
这种方案是最常见也是比较简单的方案,不过通常有这种设计已经够了,这种方案对于每一个操作不做控制,只是在程序中根据角色对是否具有操作的权限进行控制;这里我们就不做详述.此处采用角色关联模块的方式。
2. 多系统基于操作的权限设计
这种模式下每一个操作都在数据库中有记录,用户是否拥有该操作的权限也在数据库中有记录,结构如下:
但是如果直接使用上面的设计,会导致数据库中的_SysUserFuncOperate这张表数据量非常大,所以我们需要进一步设计提高效率,请看方案3
3. 多系统基于角色和操作的权限设计
如上图所示,我们通过采用角色分配操作的方式,这样子就可以减少操作权限表(_SysRoleFuncOperate) 中的记录,并且使设计更灵活一点。
但是这种方案在用户需求的考验之下也可能显得不够灵活够用,例如当用户要求临时给某位普通员工某操作权限时,我们就需要新增加一种新的用户角色,但是这种用户角色是不必要的,因为它只是一种临时的角色,如果添加一种角色还需要在收回此普通员工权限时删除此角色,我们需要设计一种更合适的结构来满足用户对权限设置的要求。
4. 2,3组合的权限设计,其结构如下:
我们可以看到在上图中添加了_SysUserFunc和_SysUserFuncOperate表,使用此表来添加特殊用户的权限。这样在应用程序中我们就需要通过_SysUserFuncOperate和_SysRoleFuncOperate两张表中的记录判断权限。
当然,有可能用户还会给出这样的需求:对于某一种Operate所操作的对象某一些记录会有权限,而对于其他的记录没有权限,比如说一个内容管理系统,对于某一些频道某个用户有修改的权限,而对于另外一些频道没有修改的权限,这时候我们需要设计更复杂的权限机制,对于此种情况,此处不作讨论,将会在以后把这种情况分为业务权限一块分析处理。
补充:
对于上面介绍,有一些基础数据未列出,下图显示全部表的关系。其中有_SysFuncOperate,_System,_SysFunctions.
_SysFuncOperate:模块操作权限表,记录此模块所有的操作权限。
_Systems:全部系统
_SysFunctions:全部系统模块
备注:由于_SysFunctions加入的CultureInfo,多语言版本显示问题,所以在图上不能直接标示_SysUserFunc与_SysFunctions和_SysRoleFunc与_SysFunctions的关系。其原本SysID,FuncID是_SysUserFunc及_SysRoleFunc外键。
以前看过一篇文章,说一个软件的组成部分:50%的业务,50%的软件(包括50%的数据库设计和50%程序设计),实际上程序设计只占了25%,不知道大家是否认同这样的观点。
简单介绍一下数据库,表结构及字段说明如下,由于本人志向于设计开发大系统数据库,所以表会尽量满足简多易于理解。
如果三五个表就能解决系统菜单,权限问题,我想,像移动139提供一些个人菜单定制功能的话那系统性能不知道会怎么样。
数据库名:RoleSystem
表名:_Roles(角色表,存储各个子系统角色)
|
序号 |
列名 |
数据类型 |
长度 |
标识 |
主键 |
允许空 |
默认值 |
说明 |
|
1 |
RecID |
int |
4 |
是 |
|
否 |
|
记录编号 |
|
2 |
SysID |
varchar |
20 |
|
是 |
否 |
|
系统编号 |
|
3 |
RoleID |
varchar |
20 |
|
是 |
否 |
|
角色编号 |
|
4 |
RoleName |
nvarchar |
50 |
|
|
否 |
|
角色名称 |
|
5 |
Note |
nvarchar |
50 |
|
|
是 |
|
|
|
6 |
Pause |
bit |
1 |
|
|
否 |
((0)) |
停用 |
表名:_OperateList(操作列表,存储系统中存在的操作)
|
序号 |
列名 |
数据类型 |
长度 |
标识 |
主键 |
允许空 |
默认值 |
说明 |
|
1 |
RecID |
int |
4 |
是 |
|
否 |
|
|
|
2 |
OperateID |
varchar |
20 |
|
是 |
否 |
|
操作编号 |
|
3 |
OperateName |
nvarchar |
50 |
|
|
否 |
|
操作名称 |
|
4 |
Note |
nvarchar |
50 |
|
|
是 |
|
|
表名:_SysFuncOperate(系统模块操作,存储系统中每个模块具体的操作)
|
序号 |
列名 |
数据类型 |
长度 |
标识 |
主键 |
允许空 |
默认值 |
说明 |
|
1 |
RecID |
int |
4 |
是 |
|
否 |
|
|
|
2 |
SysID |
varchar |
20 |
|
是 |
否 |
|
系统编号 |
|
3 |
FuncID |
varchar |
20 |
|
是 |
否 |
|
模块编号 |
|
4 |
OperateID |
varchar |
20 |
|
是 |
否 |
|
操作编号 |
|
5 |
OperateText |
nvarchar |
50 |
|
|
否 |
|
|
|
6 |
Note |
nvarchar |
50 |
|
|
是 |
|
|
表名:_SysFunctions(系统模块,存储各个子系统的模块信息)
|
序号 |
列名 |
数据类型 |
长度 |
标识 |
主键 |
允许空 |
默认值 |
说明 |
|
1 |
RecID |
int |
4 |
是 |
|
否 |
|
|
|
2 |
CultureInfo |
varchar |
10 |
|
是 |
否 |
('en-us') |
语言 |
|
3 |
SysID |
varchar |
20 |
|
是 |
否 |
|
系统编号 |
|
4 |
FuncID |
varchar |
20 |
|
是 |
否 |
|
模块编号 |
|
5 |
ParentID |
varchar |
20 |
|
|
是 |
|
上级编号 |
|
6 |
FuncName |
nvarchar |
30 |
|
|
是 |
|
模块名称 |
|
7 |
URL |
nvarchar |
100 |
|
|
否 |
|
模块地址 |
|
8 |
Target |
nvarchar |
10 |
|
|
是 |
|
|
|
9 |
Icon |
nvarchar |
20 |
|
|
是 |
|
|
|
10 |
Path |
nvarchar |
200 |
|
|
是 |
|
路径 |
|
11 |
IsEnd |
bit |
1 |
|
|
否 |
|
叶结点 |
表名:_SysRoleFunc(系统角色模块,存储各个子系统各个角色允许访问的模块信息)
|
序号 |
列名 |
数据类型 |
长度 |
标识 |
主键 |
允许空 |
默认值 |
说明 |
|
1 |
RecID |
int |
4 |
是 |
|
否 |
|
|
|
2 |
SysID |
varchar |
20 |
|
是 |
否 |
|
系统编号 |
|
3 |
RoleID |
varchar |
20 |
|
是 |
否 |
|
角色编号 |
|
4 |
FuncID |
varchar |
20 |
|
是 |
否 |
|
模块编号 |
表名:_SysRoleFuncOperate(系统角色模块操作,存储系统角色所拥有模块所具体的操作)
|
序号 |
列名 |
数据类型 |
长度 |
标识 |
主键 |
允许空 |
默认值 |
说明 |
|
1 |
RecID |
int |
4 |
是 |
|
否 |
|
|
|
2 |
SysID |
varchar |
20 |
|
是 |
否 |
|
系统编号 |
|
3 |
RoleID |
varchar |
20 |
|
是 |
否 |
|
角色编号 |
|
4 |
FuncID |
varchar |
20 |
|
是 |
否 |
|
模块编号 |
|
5 |
OperateID |
varchar |
20 |
|
是 |
否 |
|
操作编号 |
|
6 |
Note |
nvarchar |
50 |
|
|
是 |
|
|
表名:_SysUserFunc(系统用户模块,存储系统用户所具有的模块)
|
序号 |
列名 |
数据类型 |
长度 |
标识 |
主键 |
允许空 |
默认值 |
说明 |
|
1 |
RecID |
int |
4 |
是 |
|
否 |
|
|
|
2 |
UserID |
varchar |
20 |
|
是 |
否 |
|
用户编号 |
|
3 |
SysID |
varchar |
20 |
|
是 |
否 |
|
系统编号 |
|
4 |
FuncID |
varchar |
20 |
|
是 |
否 |
|
模块编号 |
表名:_SysUserFuncOperate(系统用户模块操作,存储用户所具有模块的操作)
|
序号 |
列名 |
数据类型 |
长度 |
标识 |
主键 |
允许空 |
默认值 |
说明 |
|
1 |
RecID |
int |
4 |
是 |
|
否 |
|
|
|
2 |
SysID |
varchar |
20 |
|
是 |
否 |
|
系统编号 |
|
3 |
UserID |
varchar |
20 |
|
是 |
否 |
|
用户编号 |
|
4 |
FuncID |
varchar |
20 |
|
是 |
否 |
|
模块编号 |
|
5 |
OperateID |
varchar |
20 |
|
是 |
否 |
|
操作编号 |
|
6 |
Note |
nvarchar |
50 |
|
|
是 |
|
|
表名:_Users(用户表)
|
序号 |
列名 |
数据类型 |
长度 |
标识 |
主键 |
允许空 |
默认值 |
说明 |
|
1 |
RecID |
int |
4 |
是 |
|
否 |
|
|
|
2 |
UserID |
varchar |
20 |
|
是 |
否 |
|
用户编号 |
|
3 |
UserName |
nvarchar |
50 |
|
|
否 |
|
用户名 |
|
4 |
Password |
varchar |
32 |
|
|
否 |
|
密码 |
|
5 |
DivID |
varchar |
20 |
|
|
否 |
|
部门编号 |
|
6 |
EmpID |
varchar |
20 |
|
|
是 |
|
员工编号 |
|
7 |
IsTopSuper |
bit |
1 |
|
|
否 |
((0)) |
|
|
8 |
IsDivSuper |
bit |
1 |
|
|
否 |
((0)) |
|
|
9 |
Pause |
bit |
1 |
|
|
否 |
((0)) |
|
|
10 |
LoginDT |
datetime |
8 |
|
|
是 |
|
|
|
11 |
CreateDT |
datetime |
8 |
|
|
是 |
|
|
|
12 |
CreateBy |
nvarchar |
20 |
|
|
是 |
|
|
表名:_Systems(系统表,存储软件的全部子系统)
|
序号 |
列名 |
数据类型 |
长度 |
标识 |
主键 |
允许空 |
默认值 |
说明 |
|
1 |
RecID |
int |
4 |
是 |
|
否 |
|
|
|
2 |
SysID |
varchar |
20 |
|
是 |
否 |
|
系统编号 |
|
3 |
SysName |
nvarchar |
50 |
|
|
否 |
|
系统名称 |
|
4 |
Note |
nvarchar |
200 |
|
|
否 |
|
|
|
5 |
Pause |
bit |
1 |
|
|
否 |
|
|
表名:_UsersRoles(用户角色,存储用户所具有的角色)
|
序号 |
列名 |
数据类型 |
长度 |
标识 |
主键 |
允许空 |
默认值 |
说明 |
|
1 |
RecID |
int |
4 |
是 |
|
否 |
|
|
|
2 |
UserID |
varchar |
20 |
|
是 |
否 |
|
用户编号 |
|
3 |
SysID |
varchar |
20 |
|
是 |
否 |
|
系统编号 |
|
4 |
RoleID |
varchar |
20 |
|
是 |
否 |
|
角色编号 |
|
5 |
WithGrant |
bit |
1 |
|
|
否 |
((0)) |
二级授权 |
|
6 |
Pause |
bit |
1 |
|
|
否 |
|
|
浙公网安备 33010602011771号