控件级RBAC的实现
最近做了一个基于控件级的RBAC,还有很多地方不够成熟,现拿出来与大家讨论。
实现技术:silverlight+wcf+linq+C#
权限控制流程:1.配置可控模块(控件)
2.配置角色(角色权限配置)
3.配置用户(用户角色选择,一个用户可有多个角色)
表结构:1.页面表(存放可控页面)
2.控件表(存放可控控件)
3.控件操作表(存放控件各个操作的权值)
4.角色表(存放角色ID和角色名)
5.用户表(存放用户ID,及用户信息)
6.用户角色表(映射角色与用户的关系)
7.角色权限表(角色某个控件的权值)
当然还有一张操作表,但是我将其定死了,也就是说规定某一类控件只有增删改等操作,但是有几种控件除外,例如datagird,这类控件因为需要控制现在的字段,所以将其各个字段分别作为一种操作。
因为datagrid的控制比较特殊,所以下面介绍实现的具体过程:
下图是可控页面选择:
实现的具体思路:1.遍历项目中需要控制的页面类型
Assembly a = Assembly.GetCallingAssembly();
foreach (Type type in a.GetTypes())
{
}
2 .利用发射实例化页面将其放入一个容器(我选择用viewbox)
object obj = type.Assembly.CreateInstance(type.ToString());
ChildWindow ss = (ChildWindow)obj;
((Viewbox)this.FindName("v" + i)).Child = ss;

下图是可控控件选择的过程:
1.选中控件后,将控件的ID,和页面的ID,以及控件的TYPE,以及如果是datagrid类型,就将datagrid中所有的字段的header存放在一个list<string>中,将这些数据传给实施配置的页面。
当然实施的过程中遇到一个问题,选择控件后,需要将该viewbox所在页面给关闭,但是viewbox中显示的页面通过调试得知或许不到该viewbox所在的页面。所以我只能利用一个监视器,监视独立存储中是否有刚才配置的信息,如果发现存在,就将该可控页面选择的页面关闭。

下图是信息传入的页面,点击保存后将可控页面和可控控件ID以及控件的各个操作的权值存入数据库。
下面介绍下权值分配方式,如果一个datagrid有五个显示字段,Math.Pow(2, x++)
所以分别给这五个字段权值:1,2,4,8,16


下图是角色管理页面:

下图是角色权限配置页面:
我是以一个树形结构来展示模块:我们能看到刚刚配置的可控权限模块已经在该树形结构中展现出来,并且可控控件的所有字段也已经在该可控控件的操作中出现。
该树形结构的实现如果有朋友有兴趣,可以联系我,qq:402914759

下面我们将检查医生和检查医院两个字段勾去,让这个角色失去对这两个字段的浏览权
保存后 该角色的角色色权限表新增一条数据,描述该角色对该可控控件的所拥有的权值
如果所拥有的权值为1+2+4+8+16+32+64,则该用户拥有对该控件的完全控制权,如果检查医生字段的权值为32
检查医院字段的权值为64,那么该用户的权值则是1+2+4+8+16。

下面是用户管理界面:
我们新增一个用户,该用户的角色选择刚刚新增的那个用户。然后保存。

下图是效果图,检查医生和检查医院两个字段被隐藏了。

小弟刚做权限不久,有很多地方不甚了解,希望您能提出宝贵意见,谢谢。
联系用QQ:402914759

浙公网安备 33010602011771号