可编程的权限控制框架


相关博客: http://heguo.cnblogs.com

编码规范: 参考这里

安装要求: vs2010 旗舰版 + sp1 + mvc3  + powershell2.0 + nuget + EF4.2 + Unity2.0

联系方式: heguosohu#sohu.com

测试用户名: test   密码: test

目录及依赖关系: 参考这里

2012.12.23 初次发布,代码未整理,供参考。

使用场景举例,若开发人员登录可以删除操作日志:

1.登录的当前用户设置开发人员角色

Unity.Instance.GetService<IPermissionService>().CurrentUser.RoleList.Add(new DevPermissionRole(UserCode:"user"));

2.设置开发人员可以做删除日志操作

Unity.Instance.GetService<IRolePermissionDataService>().AddRolePermission<DevPermissionRole>(
new List<string>() { "DeleteLogEntity", // "删除操作日志" }
);

若ASP.NET MVC3 可能是这样:

Unity.Instance.GetService<IRoleActionDataService>().AddRoleAction<DevPermissionRole>(
           new List<ActionPermission>
            {
               new ActionPermission()
               {
                     HttpMethod="Post",
                     Namespace="SysModule",
                     Controller="LogEntity",
                     Action = "Delete"
               },
            }
);

若Wcf或ASP.NET WebForm调用可能是这样:

Unity.Instance.GetService<IRoleFileDataService>().AddRoleFile<DevPermissionRole>(
new List<FilePermission>() { new FilePermission() { HttpMethod="*", FileName = "EntityDataService.svc", }, }
);

3.设置开发人员可以读取和删除自己的日志

protected override System.Linq.Expressions.Expression<Func<LogEntity, bool>> ReadExpression()
{
       var devPermissionRole =  Unity.Instance.GetService<IPermissionService>().CurrentUser.AsRole<DevPermissionRole>();
       if (devPermissionRole != null)
       {
             return (logEntity => logEntity.CreatorNo == devPermissionRole.UserCode);
       }

       return (i => true);
}

4.测试当前登录的用户是否可以做删除日志操作

A.若当前用户没有此权限,引发PermissionException异常

Unity.Instance.GetService<IPermissionService>().AllowPermissionItem(PermissionName:"DeleteLogEntity");

 

B.若当前用户没有权限访问 http://localhost/SysModule/LogEntity/Delete, 则返回PermissionException 异常

Unity.Instance.GetService<IPermissionService>().AllowPermissionItem(PermissionName:"Action:[Post]SysModule/LogEntity/Delete");

 

C.若当前用户没有此权限,则返回false

Unity.Instance.GetService<IPermissionService>().TryTestAllowPermissionItem(EnumPermissionName.DeleteLogEntity); 

 

D.若当前用户不是开发人员,则返回false

 Unity.Instance.GetService<COM.Data.IPermissionService>().CurrentUser.IsInRole(DevPermissionRole.Instance.EnumRoleName);

 

E.可获得鉴权参数进一步编码实现复杂的权限控制

   var devPermissionRole = Unity.Instance.GetService<COM.Data.IPermissionService>().CurrentUser.AsRole(DevPermissionRole);
   if(devPermissionRole != null)
   {
        ... 
devPermissionRole.UserCode; //自定义角色鉴权参数,例如用户名,所属部门等角色附加信息

 

F.返回的所有数据都是当前用户的记录,其它用户的操作记录数据不能被检索到。

var q = logEntityRepository.GetMany(logEntity=>true);

 

 

G.若当前用户没有删除此操作记录的权限,引发异常。

   logEntityRepository.Remove(logEntity);

 

亮点:

1. 基于角色的简洁权限控制逻辑(RBAC),不引入用户组、岗位、职务、组织架构等概念(引入了角色鉴权参数概念)。

2. 可以轻易与现有项目集成。多项目可以共享权限控制框架,同时可以集成到富客户端,如 WPF 或 WinForm 项目,未来上传 WPF 集成示例。

3. 针对 MVC3 项目,此框架另外扩展了对 Action 调用的权限控制,对文件访问的权限控制,WCF访问控制。

4. 支持多数据库,共享权限控制框架。权限设置,用户管理可以使用示例自带的数据库,原有的数据库,甚至不用数据库。

5. 分层设计,数据访问用 EF 4.X + Repository 模式,对象容器用 Unity 2.0 。

6. 没有Session,没有视图,没有存储过程,保持简洁。

7. 提供了一套 T4 模板,可以快速生成简易代码。

类图:

类说明:

LoginService: 负责用户登录后,在当前用户设置角色。

IPrinpleService: 返回CurrentUser,如果是Web项目,把登录信息放在Cookie里。

IPermissionService: 也返回CurrentUser,判断当前用户是否有权限操作某功能项。如果是Web项目,可能是判断当前用户是否有权限访问URL或文件。

IPermissionUserPrinple: 当前登录的用户信息,AsRole<IPermissionRole>()方法返回所属角色对象。如果是Web项目,亦可以HttpContext.Current.User As IPermissionUserPrinple返回当前用户。

Last edited Dec 23, 2012 at 3:54 PM by shuozi, version 4