打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
如何给多个子系统设计一个简单通用的权限管理方案?(详细讲解及源代码下载)

转自:http://www.cnblogs.com/kudy/archive/2011/11/10/2243810.html

前天已发过文章分享了刚完成的一个主数据系统,受到了不少朋友的关注,这篇文章主要是对主数据权限设计方案的讲解,希望对大家有所帮助。源码下载与运行说明请查看 分享一个通用强大的主数据管理系统(架构设计讲解及源码下载) 

 

  权限管理一般为分授权、验权两大块,另外还有验权测试,这是在系统测试阶段要完成的工作。这里重点要讲的是授权,验权会讲一部分。

 

一、主要数据表设计

 

这是权限分组表,设计它是为了在管理权限时更加清晰,没其它特别的意义。

 

这是权限项表,这个表是重点,其中:

Code是对应系统中的权限码(例如删除用户:delete_user),最终验权的时候是权限这个权限码来获取权限值的。

DisplayStyle是权限项的显示样式,除了CheckBox是简单true/false权限外,TextBox、DropDownList、TreeView这三种都是自己定义数据型权限,也是难点,更是本设计方案的特色,当然还可以扩展其它类型的权限。

JsonDataUrl是支持远程权限值的初始化,JsonDataConst是支持静态权限值的初始化,Json数据格式如下:

 

下面看看添加权限项的界面:

 然后看看授权的界面:

 

这是角色表,每个系统都有自己的多个角色,每个角色都有自己的权限,其中PermissionJsonData就是用于保存权限的。

 

这是用户个人的永久权限表,其中PermissionJsonData就是用于保存权限的。

这是用户个人的临时权限表,其中PermissionJsonData就是用于保存权限的,BeginDate和EndDate保存权限的有效日期。

 

这个表是用于保存用户与角色的关系的,一个用户可以拥有一个或多个角色。

 

二、受权的代码实现

首先,我们需要按需求来定义合理的数据模型(主要给系统的表示层使用的),其中DbModels里放的是和数据表对应的数据模型,ExtendedModels里放的是特别需求扩展的数据模型,JsonModels里放的是Json数据序列化需要的数据模型。其中PermissionDropDownListOption是为DropDownList类型权限设计的,PermissionTreeViewNode是为TreeView类型权限设计的,代码如下:

PermissionDropDownListOption

 

PermissionTreeViewNode

 

写到这,大家先看一下授权的页面,初始化控件和保存权限都算是一个难点,在显示权限控件方面,其实只要获取相应系统的所有权限项,根据类型来输出html就行了,难的是DropDownList和TreeView控件,下面两个方法是返回它们所需的Json数据:

        ///<summary>
/// 获取树视图Json数据
///</summary>
[Action]
public void GetTreeViewPermissionJsonData(Guid systemId, Guid permissionItemId, string[] checkedIds)
{
PermissionItemModel permissionItem = PermissionItemService.GetById(permissionItemId);

// 转为对象
PermissionTreeViewJsonData nodes = PermissionUtils.ParsePermissionControlJsonData<PermissionTreeViewJsonData>(this, systemId, permissionItem);

// 初始已选数据
PermissionUtils.InitTreeViewCheckedNodes(nodes, checkedIds);

JsonResult(nodes);
}

///<summary>
/// 获取下拉框Json数据
///</summary>
[Action]
public void GetDropDownListPermissionJsonData(Guid systemId, Guid permissionItemId, string selectedValue)
{
PermissionItemModel permissionItem = PermissionItemService.GetById(permissionItemId);

// 先转为对象
PermissionDropDownListJsonData options = PermissionUtils.ParsePermissionControlJsonData<PermissionDropDownListJsonData>(this, systemId, permissionItem);

// 初始已选数据
PermissionUtils.InitDropDownListSelectedOptions(options, selectedValue);

JsonResult(options);
}

 

重点工作都交给了PermissionUtils助手类来处理了,请看下面的代码

 public static class PermissionUtils

 

显示控件处理完了,那保存权限值呢?获取权限值的实现也放在PermissionUtils助手类里了,第一个方法GetPostedPermissionValues就是获取提交的权限值。

 

三、验权的代码实现

每个用户有多个角色,又有永久和临时权限,那总要处理权限的合理继承吧,本方案是这样处理的:

1. 单选框 与 树视图 类型,在 角色权限、永久权限、临时权限(有效时期内) 中任何已勾选的权限都会一直会继承下去;

2. 文本框 与 下拉框 类型,是按 临时权限 -〉永久权限 -〉角色权限(按排序的顺序) 的顺序,前者的权限为空或没有选择时才会继承后者的权限值;

这些处理都在用户登录成功的时候处理的,并保存权限值到一个字典里,实现代码在MDMS.UserApiModule项目中的UserApiService类:

合并用户权限

 

要验证权限,那首先要做的就是获取权限值,在MDMS.UserApiModule项目中的ServiceContextBase类中实现所有类型的权限值获取方法,所以子系统只要继承这个类,就可以轻松的进行权限的验证了,请看获取权限值的方法实现:

Permission Services

另外值得说的是,GetTreeViewPermissionValue方法有个Func<List<T>, List<T>> rectifyValues参数,它的作用是,如果在授权时勾选了某个根节点,那表示此根节点下的所有权限都是有的,包括以后在该根节点新加的子节点,所以需要额外根据根节点获取所有的子节点,以确保获取的权限是完整的。

在主数据系统设计中,主数据系统也被当成自己的一个子系统来处理了,下面看看主数据页面基类是怎么获取权限的?

验证权限

 

有了上面的页面基类,最后的权限验证就变得简洁方便了


 

写到这就算结束了,设计中的内容比较多,不好处处仔细的解说。本方案中,用json来保存权限使实现变得简单了很多,而且是采用key/value的字典格式,所以子系统在以后需要新增新的权限项或删除权限项,都不会影响到用户的权限(意思是不用解决权限版本问题,随意添加删除权限都可以正常动作),时间问题只能以这种方式来讲解了,需要深入了解本方案设计的朋友请下载整个系统的源码来看,如果本文对你有帮助,请点击推荐以示支持,谢谢。

 

在线demo: http://mdms.kudystudio.com/

用户/密码:test1/test1 test2/test2 (注:同一用户在另一浏览器登录,另一用户在session失效后会被逼下线)

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
如何打造一个智慧工地?系统总体思路全在这里了!
asp.net Core 中AuthorizationHandler 实现自定义授权
python使用json格式进行数据封装
使用JSON实现数据交换
14.4 JSON数据
Java-Birt报告中的嵌套循环
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服