可编程的权限控制框架
相关博客: 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返回当前用户。