通用权限的一些整理思考

通用权限是一个比较古老的话题,从有软件系统开始,就有权限管理,但是真正要实现一个通用的细粒度、高可用、高扩展性的完整权限管理系统,并不是一件简单的事情。

本文只是一个引子,文字不多,但要真正理解还是需要仔细琢磨,需要的不妨Mark,在真正做权限的时候,思考得比较详细的时候再反过来看看,也许会有一些收获。

先上图,图比较大,请放大后查看。(右击图片,在新标签页中查看,点击放大图标,查看原始图)

再上数据字典,基本上考虑了上图的所有权限设计点,具体如何在数据库设计中体现,请自行思考,后续整个系统开发完成后,有精力时再重新完整梳理一遍。

以下数据字典由软件pdmreader(可从http://www.pdmreader.com/下载)从PDM转换,转换过程字段名被全部自动转换为了大写,单不影响理解。

信息

项目名称

通用权限管理

数据库类型

Sqlserver 2012

表数量

10

更新日期

2017年10月21日


数据表清单:

表名

解释

DATAITEM

数据项(DataItem)

EMPINFO

雇员信息(EmpInfo)

ICONITEM

图标项(IconItem)

MODULEPAGE

模块页面项(ModulePage)

ORGINFO

组织机构(OrgInfo)

RIGHTITEM

权限项(RightItem)

RIGHTMAP

权限映射(RightMap)

ROLEINFO

角色信息(RoleInfo)

SYSTEMITEM

系统项(SystemItem)

USERINFO

用户信息(UserInfo)


表名:DATAITEM

解释:数据项(DataItem)
备注: 数据项
数据行、列 权限来自于DLL
数据项和系统没有直接关系,由Page关联
一个数据项可属于多个系统
数据权限筛选器
比如:我添加的、自己部门的、
自己门店的、上一个月的、
张三和王五的

DATAITEM(数据项(DataItem))

是否主键

字段名

字段描述

数据类型

长度

可空

约束

缺省值

备注

DATAKEY

数据项标识

NVARCHAR(50)

50

     

数据项标识

 

DATANAME

数据权限名称

NVARCHAR(50)

50

     

数据权限名称

 

DATAKIND

数据类型

INT

     

0

数据类型

①列表②实体,当前只支持列表,以后可能会有其它类型

 

RIGHTKIND

权限类型

INT

       

权限类型

①行权限②列权限③单元格权限(单元格由RilterRules和OwnColumns共同决定)

 

TARGETMODEL

目标模型

NVARCHAR(1000)

1000

   

''

目标模型

对应实体全名

 

FILTERRULES

权限过滤规则

NVARCHAR(1000)

1000

   

''

权限过滤规则

序列化后的FilterRule树,在业务层实现反序列化、上下文替换、注入过滤、SQL集成

 

OWNCOLUMNS

拥有的列

NVARCHAR(1000)

1000

   

拥有的列

 

OWNRIGHTS

拥有的操作

NVARCHAR(1000)

1000

   

''

拥有的操作

对应到有权限的行上能进行哪些操作,比如一个页面可查看的和可修改的可以分开定义数据权限

 

SORTCODE

排序码

INT

     

0

排序码

 

TENANTID

租户Id

INT

       

租户Id

 

CREATETIME

创建日期

DATETIME

     

getdate()

创建日期

 

CREATEUSERID

创建用户

INT

       

创建用户

 

MODIFYTIME

修改日期

DATETIME

     

getdate()

修改日期

 

MODIFYUSERID

修改用户

INT

       

修改用户

 

REMARK

备注

NVARCHAR(MAX)

     

''

备注

 

STATES

状态

INT

     

0

状态

当前只有在用状态

[返回]


表名:EMPINFO 解释:雇员信息(EmpInfo)
备注: 雇员信息

EMPINFO(雇员信息(EmpInfo))

是否主键

字段名

字段描述

数据类型

长度

可空

约束

缺省值

备注

EMPKEY

雇员主键

NVARCHAR(50)

50

     

雇员主键

 

EMPKIND

雇员类型

INT

       

雇员类型

正式员工、试用员工、外聘人员、实习人员等

 

ORGKEY

所属机构

NVARCHAR(50)

50

     

所属机构

 

JOINTIME

入职时间

DATETIME

       

入职时间

 

JOBLEVEL

职级

NVARCHAR(50)

50

   

''

职级

初级、中级、高级

 

JOBPOSITION

职位

NVARCHAR(50)

50

   

-1

职位

软件工程师、设计师、安装工、生产工人

 

JOBTITLE

职称

NVARCHAR(50)

50

   

''

职称

职称=职级+职位,比如高级软件工程师、高级设计师等

 

JOBWORKS

工作

NVARCHAR(1000)

1000

   

''

工作

App开发、后端开发、UI设计、橱柜安装、衣柜安装、开料、包装

 

TAGS

标签

NVARCHAR(1000)

1000

   

''

标签

余料字段

 

TENANTID

租户Id

INT

       

租户Id

 

STATES

状态

INT

     

0

状态

[返回]


表名:ICONITEM 解释:图标项(IconItem)
备注: 图标项

ICONITEM(图标项(IconItem))

是否主键

字段名

字段描述

数据类型

长度

可空

约束

缺省值

备注

ICONKEY

图标键

NVARCHAR(50)

50

     

图标键

 

ICONNAME

图标名称

NVARCHAR(100)

100

     

图标名称

 

ICONKIND

图标类型

INT

       

图标类型

1流、2文件、3字体

 

ICONFILEKIND

文件类型

INT

       

文件类型

1字体、2svg、3ico、4png、5jpg、6gif

 

ICONCONTENT

图标二进制内容

IMAGE

       

图标二进制内容

 

ICONURL

文件路径

NVARCHAR(1000)

1000

     

文件路径

 

ICONFONT

字体名称

NVARCHAR(50)

50

     

字体名称

 

ICONLENGTH

长度

INT

     

0

长度

 

ICONWIDTH

宽度

INT

     

0

宽度

 

USEKIND

使用类型

INT

       

使用类型

1任务单图标、2菜单图标、3按钮图标

 

GROUPIC

分组标识

NVARCHAR(50)

50

   

''

分组标识

默认无分组,则空

 

TAGS

标签

NVARCHAR(1000)

1000

   

''

标签

 

TENANTID

租户Id

INT

       

租户Id

 

CREATETIME

创建日期

DATETIME

     

getdate()

创建日期

 

CREATEUSERID

创建用户

INT

       

创建用户

 

MODIFYTIME

修改日期

DATETIME

     

getdate()

修改日期

 

MODIFYUSERID

修改用户

INT

       

修改用户

 

SORTCODE

排序码

INT

     

0

排序码

 

REMARK

备注

NVARCHAR(MAX)

     

''

备注

 

STATES

状态

INT

     

0

状态

在用、停用、移除

[返回]


表名:MODULEPAGE 解释:模块页面项(ModulePage)
备注: 模块页面项
Marks:
相当于给页面附加一系列包含标记或排除标记
辅助数据权限和操作权限验证

可以理解为系统结构
System
     Modules
         Groups
              Menu1---Rights、Datas、Marks
              Menu2---Rights、Datas、Marks
             ……
         

MODULEPAGE(模块页面项(ModulePage))

是否主键

字段名

字段描述

数据类型

长度

可空

约束

缺省值

备注

ITEMKEY

项主键

NVARCHAR(50)

50

     

项主键

 

ITEMKIND

项类型

INT

       

项类型

1子系统、2模块、3组、4web菜单、5win菜单……

 

ITEMNAME

项名称

NVARCHAR(50)

50

     

项名称

 

ITEMCODE

项编码

NVARCHAR(50)

50

     

项编码

 

ITEMPATH

项路径

NVARCHAR(1000)

1000

   

''

项路径

 

ITEMICON

项图标

NVARCHAR(100)

100

   

''

项图标

 

ISMENU

是否是菜单

BIT

     

0

是否是菜单

 

SYSTEMKEY

所属子系统

NVARCHAR(50)

50

     

所属子系统

 

MODULEKEY

模块主键

NVARCHAR(50)

50

   

''

模块主键

 

PARENTKEY

上级主键

NVARCHAR(50)

50

   

0

上级主键

 

CHILDKEYS

所有直属子级标识

NVARCHAR(MAX)

     

''

所有直属子级标识

排序使用,逗号分隔的字符串列表

 

PARENTKEYS

所有父级标识

NVARCHAR(MAX)

     

''

所有父级标识

路径码替代字段,逗号分隔的字符串列表

 

RIGHTS

页面所有操作权限

NVARCHAR(1000)

1000

   

''

页面所有操作权限

 

DATAS

页面所有数据权限

NVARCHAR(1000)

1000

   

''

页面所有数据权限

 

MARKS

页面所有权限标记

NVARCHAR(1000)

1000

     

页面所有权限标记

权限标记实体在逻辑层定义,包含Key、Name、Remark

 

CONFIGVALUE

配置值

NVARCHAR(MAX)

     

''

配置值

菜单上的配置信息

 

CONFIGTARGET

配置目标实体

NVARCHAR(1000)

1000

   

''

配置目标实体

 

CONFIGFORM

配置窗体

NVARCHAR(50)

50

   

''

配置窗体

存储ConfigTaget实体对应的编辑窗体PresentCode

 

CONFIGPARSER

配置解析器

NVARCHAR(50)

50

   

''

配置解析器

 

ARGS

参数

NVARCHAR(1000)

1000

   

''

参数

Action菜单,传递给Action的参数列表

 

TAGS

标签

NVARCHAR(1000)

1000

   

''

标签

预留

 

SORTCODE

排序码

INT

     

0

排序码

上移下移支持

 

TENANTID

租户Id

INT

       

租户Id

 

CREATETIME

创建日期

DATETIME

     

getdate()

创建日期

 

CREATEUSERID

创建用户

INT

       

创建用户

 

MODIFYTIME

修改日期

DATETIME

     

getdate()

修改日期

 

MODIFYUSERID

修改用户

INT

       

修改用户

 

REMARK

备注

NVARCHAR(MAX)

     

''

备注

 

STATES

状态

INT

     

0

状态

[返回]


表名:ORGINFO 解释:组织机构(OrgInfo)
备注: 组织机构

ORGINFO(组织机构(OrgInfo))

是否主键

字段名

字段描述

数据类型

长度

可空

约束

缺省值

备注

ORGKEY

机构主键

NVARCHAR(50)

50

     

机构主键

 

ORGKIND

机构类型

INT

   

0 总公司
1 子公司
2 直营店
3 经销商
4 分工厂
5 供应商
6 合作伙伴

 

机构类型

公司、部门:0_总公司、1_子公司、2_直营店、3_经销商、4_分工厂、5__供应商、6_合作伙伴

 

ORGNAME

机构名称

NVARCHAR(50)

50

     

机构名称

 

ORGCODE

机构编码

NVARCHAR(50)

50

   

''

机构编码

 

PARENTKEY

直属父级机构

NVARCHAR(50)

50

   

-1

直属父级机构

 

PARENTKEYS

所有父级机构

NVARCHAR(MAX)

     

''

所有父级机构

便于权限验证,查看所有下级部门的数据

 

DIRECTCORPIC

直属公司

NVARCHAR(50)

50

     

直属公司

比如直营店下的员工,只能查看直营店的数据

 

SORTCODE

排序码

INT

     

0

排序码

当前只支持上移下移,拖动支持依赖于外部顺序存储,不适用此字段

 

TAGS

标签

NVARCHAR(1000)

1000

   

''

标签

预留

 

TENANTID

租户Id

INT

       

租户Id

 

STATES

状态

INT

     

0

状态

[返回]


表名:RIGHTITEM 解释:权限项(RightItem)
备注: 权限项
权限项中存储系统中所有出现过的权限,
ModulePage、DataItem添加时进行选择

RIGHTITEM(权限项(RightItem))

是否主键

字段名

字段描述

数据类型

长度

可空

约束

缺省值

备注

RIGHTKEY

权限主键

NVARCHAR(50)

50

     

权限主键

 

RIGHTCODE

权限码

NVARCHAR(50)

50

     

权限码

 

RIGHTNAME

权限名

NVARCHAR(50)

50

     

权限名

 

ICONIMAGE

图片图标

NVARCHAR(50)

50

     

图片图标

对应文件标识

 

ICONFONT

字体图标

NVARCHAR(50)

50

   

''

字体图标

对应字体样式

 

SORTCODE

排序码

INT

     

0

排序码

 

TENANTID

租户Id

INT

       

租户Id

 

CREATETIME

创建日期

DATETIME

     

getdate()

创建日期

 

CREATEUSERID

创建用户

INT

       

创建用户

 

MODIFYTIME

修改日期

DATETIME

     

getdate()

修改日期

 

MODIFYUSERID

修改用户

INT

       

修改用户

 

REMARK

备注

NVARCHAR(MAX)

     

''

备注

 

STATES

状态

INT

     

0

状态

当前只有 在用状态

[返回]


表名:RIGHTMAP 解释:权限映射(RightMap)
备注: 权限映射
一个人员可以有多个用户:
人员?用户(UserInfo外键关联Employee)
主权限都通过用户角色进行管理,包含:
用户?角色、角色?系统、角色?菜单(菜单包含权限/数据/标记)
用户直接权限:
用户单独附加或排除权限,
用户?系统、用户?菜单(菜单包含权限/数据/标记)

RIGHTMAP(权限映射(RightMap))

是否主键

字段名

字段描述

数据类型

长度

可空

约束

缺省值

备注

MAPKEY

映射标识

NVARCHAR(50)

50

     

映射标识

 

MAPNAME

名称

NVARCHAR(50)

50

     

名称

 

SOURCEKIND

源类型

INT

   

1 用户
2 角色

 

源类型

1 _用户、2_角色

 

SOURCEKEY

源标识

NVARCHAR(50)

50

     

源标识

用户主键 or 角色主键

 

TARGETKIND

目标类型

INT

   

1 系统
2 模块/菜单/操作/数据/标记

 

目标类型

1_系统、2_模块/菜单/操作/数据/标记

 

TARGETKEY

目标标识

NVARCHAR(50)

50

     

目标标识

系统主键 or 菜单主键

 

OPERATERIGHTS

拥有的操作权限

NVARCHAR(1000)

1000

   

''

拥有的操作权限

隶属操作权限.Enable,对应RightItem表

 

VISIBLERIGHTS

拥有的可见权限

NVARCHAR(1000)

1000

   

''

拥有的可见权限

隶属操作权限.Visible,对应RightItem表

 

DATARIGHTS

拥有的数据权限

NVARCHAR(1000)

1000

   

''

拥有的数据权限

对应DataItem表

 

MARKRIGHTS

拥有的标记权限

NVARCHAR(1000)

1000

   

''

拥有的标记权限

 

TAGS

标签分组

NVARCHAR(1000)

1000

   

''

标签分组

对应未域枚举,用于Dashboard、数据聚合界面,聚合权限

 

TENANTID

租户Id

INT

       

租户Id

 

CREATETIME

创建日期

DATETIME

     

getdate()

创建日期

 

CREATEUSERID

创建用户

INT

       

创建用户

 

MODIFYTIME

修改日期

DATETIME

     

getdate()

修改日期

 

MODIFYUSERID

修改用户

INT

       

修改用户

 

REMARK

备注

NVARCHAR(MAX)

     

''

备注

 

STATES

状态

INT

     

0

状态

暂时只有 在用 状态

[返回]


表名:ROLEINFO 解释:角色信息(RoleInfo)
备注: 角色信息

ROLEINFO(角色信息(RoleInfo))

是否主键

字段名

字段描述

数据类型

长度

可空

约束

缺省值

备注

ROLEKEY

角色主键

NVARCHAR(50)

50

     

角色主键

 

ROLEKIND

角色类型

INT

       

角色类型

①全局角色②自定义角色

 

ROLENAME

角色名称

NVARCHAR(200)

200

     

角色名称

 

SYSTEMKEY

系统标识

NVARCHAR(50)

50

     

系统标识

 

CORPKEY

企业标识

NVARCHAR(50)

50

     

企业标识

 

PARENTKEY

父级角色

NVARCHAR(50)

50

   

''

父级角色

 

ISSUPER

是否超级管理员

BIT

     

0

是否超级管理员

 

ALLOWS

允许行为

INT

     

1

允许行为

位域枚举,当前支持1修改2删除

 

TAGS

标签

NVARCHAR(1000)

1000

   

1

标签

预留字段

 

SORTCODE

排序码

INT

     

0

排序码

 

TENANTID

租户Id

INT

       

租户Id

 

CREATETIME

创建日期

DATETIME

     

getdate()

创建日期

 

CREATEUSERID

创建用户

INT

       

创建用户

 

MODIFYUSERID

修改用户

INT

       

修改用户

 

MODIFYTIME

修改日期

DATETIME

     

getdate()

修改日期

 

REMARK

备注

NVARCHAR(MAX)

     

''

备注

 

STATES

状态

INT

     

0

状态

[返回]


表名:SYSTEMITEM 解释:系统项(SystemItem)
备注: 系统项

SYSTEMITEM(系统项(SystemItem))

是否主键

字段名

字段描述

数据类型

长度

可空

约束

缺省值

备注

SYSTEMKEY

系统主键

NVARCHAR(50)

50

     

系统主键

 

SYSTEMKIND

类型

INT

       

类型

1 _Windows桌面程序、2_Web程序、3_App程序、4_WinService、5_微信程序

 

SYSTEMNAME

名称

NVARCHAR(50)

50

     

名称

 

ISFRONTEND

是否前端系统

BIT

     

0

是否前端系统

用户直接使用的系统

 

NEEDLOGIN

是否需要登录

BIT

     

0

是否需要登录

不需要登录的系统,相当于任何人都可以使用,不需要系统令牌单点登录验证

 

SYSTEMTOKEN

系统令牌

NVARCHAR(1000)

1000

   

''

系统令牌

 

SYSTEMICON

系统图标

NVARCHAR(100)

100

   

''

系统图标

 

DISPLAYS

显示范围

INT

   

0 所有
1 权限设置
2 入口程序

0

显示范围

显示在:1_权限设置、2_入口程序

 

TERMINALS

支持终端

INT

     

0

支持终端

支持windows pc、android、iphone、web浏览器、移动浏览器等

 

FUNCTIONS

支持功能

INT

     

0

支持功能

系统支持功能:1_SingleSignOn、2_AutoUpdate

 

TAGS

标签

NVARCHAR(1000)

1000

   

''

标签

预留

 

EXTRAS

额外信息

NVARCHAR(MAX)

     

''

额外信息

存储系统额外配置信息

 

SORTCODE

排序码

INT

     

0

排序码

当前支持上移、下移,不支持拖动排序

 

TENANTID

租户Id

INT

       

租户Id

 

CREATETIME

创建日期

DATETIME

     

getdate()

创建日期

 

CREATEUSERID

创建用户

INT

       

创建用户

 

MODIFYTIME

修改日期

DATETIME

     

getdate()

修改日期

 

MODIFYUSERID

修改用户

INT

       

修改用户

 

REMARK

备注

NVARCHAR(MAX)

     

''

备注

 

STATES

状态

INT

     

0

状态

[返回]


表名:USERINFO 解释:用户信息(UserInfo)
备注: 用户信息

USERINFO(用户信息(UserInfo))

是否主键

字段名

字段描述

数据类型

长度

可空

约束

缺省值

备注

USERKEY

用户主键

NVARCHAR(50)

50

     

用户主键

 

USERKIND

类型

INT

       

类型

备用字段

 

USERNAME

用户名

NVARCHAR(50)

50

     

用户名

 

NICKNAME

昵称

NVARCHAR(50)

50

     

昵称

 

USERAVATAR

头像

NVARCHAR(50)

50

   

''

头像

存储头像对应的文件主键

 

PHONE

手机号

NVARCHAR(20)

20

     

手机号

用于短信下发

 

EMAIL

电子邮件

NVARCHAR(50)

50

     

电子邮件

用于密码找回

 

PASSWORDS

加密后密码

NVARCHAR(1024)

1024

     

加密后密码

 

PASSWORDSALT

加密盐渍

NVARCHAR(128)

128

     

加密盐渍

 

PASSWORDWAY

加密方式

INT

     

''

加密方式

不加密、MD5、DES等

 

ALLOWLOGIN

是否允许登录

BIT

     

1

是否允许登录

 

REFUSELOGINREASON

拒绝登录原因

NVARCHAR(1000)

1000

   

''

拒绝登录原因

 

ISSUPER

是否超级管理员

BIT

     

0

是否超级管理员

 

EMPKEY

雇员主键

INT

       

雇员主键

 

SESSIONTOKEN

Session令牌

NVARCHAR(1000)

1000

   

''

Session令牌

 

LASTLOGINTIME

最后登录时间

DATETIME

     

getdate()

最后登录时间

 

LASTLOGINIP

最后登录Ip

NVARCHAR(50)

50

   

''

最后登录Ip

 

LASTLOGINTERMINAL

最后登录终端

NVARCHAR(50)

50

   

''

最后登录终端

 

LASTLOGINTICKET

最后登录票据

NVARCHAR(1000)

1000

   

''

最后登录票据

 

PROFILES

个性化配置

NVARCHAR(MAX)

     

''

个性化配置

存储用户个性化配置

 

TAGS

标签

NVARCHAR(1000)

1000

   

''

标签

备用字段

 

TENANTID

租户Id

INT

       

租户Id

 

CREATETIME

创建日期

DATETIME

     

getdate()

创建日期

 

CREATEUSERID

创建用户

INT

       

创建用户

 

MODIFYTIME

修改日期

DATETIME

     

getdate()

修改日期

 

MODIFYUSERID

修改用户

INT

       

修改用户

 

REMARK

备注

NVARCHAR(MAX)

     

''

备注

用户排序依赖于Employee外部

 

STATES

状态

INT

     

0

状态

在用,禁用,删除,禁止登陆

[返回]

 

 本文为作者原创,转载请注明出处。

原文地址:https://www.cnblogs.com/WangHuaiSheng/p/7703909.html