控件级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

 

 








 

posted @ 2010-08-04 10:19  Nicefunny  阅读(718)  评论(3)    收藏  举报