基于Newlife.XCode的权限系统(含数据集权限)【设计篇】
本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html
Newlife XCode组件相关文章目录:http://www.cnblogs.com/asxinyu/p/4329747.html
权限管理在一个系统的开发中必不可少的部分,说重要也很重要,说不重要当然也没多少人重视。说有技术含量,但也还真有点技术含量,比如博客园吉日大哥的权限系统,我也用过,不得不佩服。当然很多人也认为没什么技术含量,自己的系统中也都有这么个东西,也都能满足实际需求。
我不是专门搞开发的,所以有些东西可能偏离时间的轨道。请谅解。一直对权限系统比较感兴趣,也一直想打造一个属于自己的权限管理组件,能随心所欲的进行权限控制。我的目标是“除了普通的访问控制权限之外,还要对每个表每条记录的每个字段进行授权控制,另外要足够小和简单”不说废话了,先看数据库表结构设计,然后讲解思路:
1.权限管理的几个核心表是:用户表,角色表,权限表,用户角色表,用户权限表,角色权限表;
2.下面是数据库设计的初步版本,可能在必填和默认值上面还有些小错误,不过没关系,主要先看思路;
User: 用户表
中文名 |
英文名 |
字段名 |
数据类型 |
大小 |
主键 |
唯一 |
必填 |
默认值 |
编号 |
Id |
Id |
Int32 |
10 |
是 |
是 |
是 |
|
用户名 |
UserName |
UserName |
String |
30 |
|
|
是 |
|
密码 |
Password |
Password |
String |
50 |
|
|
是 |
|
排序码 |
SortCode |
SortCode |
Int32 |
10 |
|
|
|
|
是否有效 |
IsEnable |
IsEnable |
SByte |
3 |
|
|
|
1 |
Role: 角色表
中文名 |
英文名 |
字段名 |
数据类型 |
大小 |
主键 |
唯一 |
必填 |
默认值 |
编号 |
Id |
Id |
Int32 |
10 |
是 |
是 |
是 |
|
角色名称 |
RoleName |
RoleName |
String |
20 |
|
|
是 |
|
角色分类 |
Category |
Category |
String |
30 |
|
|
|
|
排序码 |
SortCode |
SortCode |
Int32 |
10 |
|
|
|
9999 |
是否有效 |
IsEnable |
IsEnable |
SByte |
3 |
|
|
是 |
1 |
备注 |
Description |
Description |
String |
50 |
|
|
|
Permission: 权限表
中文名 |
英文名 |
字段名 |
数据类型 |
大小 |
主键 |
唯一 |
必填 |
默认值 |
编号 |
Id |
Id |
Int32 |
10 |
是 |
是 |
是 |
|
父编号 |
ParentId |
ParentId |
Int32 |
10 |
|
|
是 |
|
数据库表名称 |
DbTable |
DbTable |
String |
50 |
|
|
|
|
权限名称 |
Name |
Name |
String |
30 |
|
|
是 |
|
是否开启数据权限 |
IsDataPermission |
IsDataPermission |
SByte |
3 |
|
|
|
0 |
数据条件 |
Constraint |
Constraint |
String |
100 |
|
|
|
|
排序码 |
SortCode |
SortCode |
Int32 |
10 |
|
|
|
9999 |
是否有效 |
IsEnable |
IsEnable |
SByte |
3 |
|
|
是 |
1 |
备注 |
Description |
Description |
String |
50 |
|
|
|
中文名 |
英文名 |
字段名 |
数据类型 |
大小 |
主键 |
唯一 |
必填 |
默认值 |
编号 |
Id |
Id |
Int32 |
10 |
是 |
是 |
是 |
|
用户编号 |
UserId |
UserId |
Int32 |
10 |
|
|
是 |
|
角色编号 |
RoleId |
RoleId |
Int32 |
10 |
|
|
是 |
中文名 |
英文名 |
字段名 |
数据类型 |
大小 |
主键 |
唯一 |
必填 |
默认值 |
编号 |
Id |
Id |
Int32 |
10 |
是 |
是 |
是 |
|
权限编号 |
PermissionId |
PermissionId |
Int32 |
10 |
|
|
是 |
|
用户编号 |
UserId |
UserId |
Int32 |
10 |
|
|
是 |
RolePermission: 角色权限表 (RolePermission)
中文名 |
英文名 |
字段名 |
数据类型 |
大小 |
主键 |
唯一 |
必填 |
默认值 |
编号 |
Id |
Id |
Int32 |
10 |
是 |
是 |
是 |
|
角色编号 |
RoleId |
RoleId |
Int32 |
10 |
|
|
是 |
|
权限编号 |
PermissionId |
PermissionId |
Int32 |
10 |
|
|
是 |
1.用户表,角色表,用户角色表很简单,就不用介绍了,它们是多对多的关系。
2 用户权限和角色权限就是权限的分配了,如果用户及其角色具有某一个权限,则具有相应的访问权限。
3.权限表,这个是核心,我觉得我的简洁之处也就是在这里。着重介绍:
- 权限表是树形的,权限的根节点是以数据库名称来划分,权限是以数据库的数据表为单位的。
- 所以,权限表有一个字段名为DbTable,这个字段是的含义是“数据库名称+数据表名称”,作用是这样的:
- 绝大部分权限都是和数据库中某个表相关的,所以这里数据表是主要的权限单位
- 每个数据库的数据表系统默认6种数据权限:添加、删除、修改、查询、菜单、全局数据权限
- 也就是说每个数据表都有6个默认的子权限节点,该类型的权限节点是可以自定义的,比如新增一个
- 数据权限只能在数据表下的5种权限中添加,比如要给 删除添加 数据权限,则在当前表的 删除权限下添加子节点,同时打开父节点的数据权限开关。
- 当然你也可以自定义一个根节点,来自定义你的相关权限。
比如上面这张简单的示意图,是每个表都有的权限结构,数据权限只能在 增加,删除,修改,查询和全局数据权限5个地方定义,并且这5个权限,若要添加子节点,只能是数据权限。
1.全局数据权限是为了方便数据权限的定义而设置的,比如增删查改,如果都要对某一个字段进行限制,那么只需要在全局里面定义就可以了,没必要到每个增删查改权限中去添加。
2. 关于自定义权限,自定义权限也可以放在任何地方,只要方便你自己就行。比如可以将自定义权限放在表下面,如果有一个表 按钮,或者 菜单,你想添加权限控制,但又和增删查改不完全相干,那你可以在这里自定义一个权限。
3.若定义数据权限,则将约束条件放在Constraint中,然后将数据权限授予角色或者用户。
4.其实用户权限表某种时候是不必要的,用户是属于角色的,只要定义角色权限即可,但为了某些临时需求,临时赋予某些用户一些权限,所以增加了用户权限表。
本权限系统基于Newlife.Xcode,数据权限的实现,就是在对实体进行增删查改时进行条件过滤,目前已经完成40%的开发工作。最近搬家,7月份还要去上海培训,所以最近一段时间是没时间做了,今天在群里面看见有人讨论数据权限,所以就趁机把自己的思路写下来。可能比较混乱,希望大家在论坛或者群里面讨论。本文对于的论坛地址为:
基于Newlife.Xcode的权限系统 欢迎讨论
http://bbs.53wb.com/forum.php?mod=viewthread&tid=196&fromuid=28
Newlife.Xcode的资源:
1.QQ群:1600800
2.博客:http://www.cnblogs.com/nnhy/
http://www.cnblogs.com/asxinyu/
3.论坛:http://www.53wb.com/
4.开源:http://xcode.codeplex.com/
.NET数据挖掘与机器学习,作者博客: http://www.cnblogs.com/asxinyu
E-mail:1287263703@qq.com