博客上有人问我: 问个技术上的问题,你指定的角色是对能操作的行为而言,但如果权限也涉及数据怎么办?比如上面,若干个管理员,高虹水厂,东蓝科技,如果这个管理员只能操作高虹水厂的数据,那个管理员只能操作东蓝科技的数据,在你的框架下怎么支持?当然也许这个例子不太好,一般来说,高虹水厂和东蓝科技的数据不会混合的,但你应该明白我上面的意思。 这个问题是属于, 数据集权限,也叫记录级权限的范畴,以下文章主要围绕上面的提问开展。
有人说:吉日你的权限太复杂。 我回答:判断一个权限,只需要一行代码,还不行吗?难道非要孙悟空式的神奇方法?才可以满足你的要求?你又想简单,又要有足够的2次开发潜力,又要调用方便,那我1行代码,你还嫌弃复杂吗?那我再怎么简化才能达到你的要求呢? this.btnUserAdd.Enabled = this.IsAuthorized("User.Add"); 有人说:吉日你的权限太全太庞大了。 我回答:我也不想做这么庞大,但是各种需求你需要满足,例如有些时候希望直接对用户设置权限,有时希望通过角色设置权限,那这要看你的软件为了满足通用性,都需要有这些功能,并且对将来的扩展,商业逻辑的变化还需要有个余地吧,你今天是这么想的,说不定明天看别人那么用,你自己的想法也会变的。你就当其他几个你不用的功能不存在,可以设置隐藏模块就可以了。 有人说:吉日你的权限是C\S的,我们要B\S的。 我回答:现在C\S的工具很多,很多代码生成器都是C\S的,QQ、MSN也都是C\S的,甚至我们的天天在用的开发软件用的VS开发环境也是C\S的,数据库系统也是C\S的,我这个工具虽然是C\S的,但是都提供了B\S的调用接口,你可以怎么调用都可以,还有你要B\S的也可以,你给多少钱?很简单的问题,毕竟不是人人都需要后台管理,也不需要天天后台管理,所以C\S的也没什么的,而且我这个C\S的又支持WebService、Remoting、WCF运行模式的,架构非常灵活。你觉得什么样的程序是好程序?我想经得起折腾得程序是最好的程序,你想怎么折腾,我都能奉陪到底,我都能经得起折腾,你需求有变化,我程序不用变,就算程序变了数据库结构也不变,那实在不行才变数据库结构,而且数据库结构变了我的程序还是很健壮,很快就可以适应,不会因为你需求经常变了,程序就瘫软了,我的程序又可以满足你最简单的需求,也能满足你最复杂的需求,最起码有2次开发的可能,可以满足你复杂的架构,甚至一个程序分布在多个数据库上的架构。 废话不说了,我们进入主题:例子程序位置为如下图:
1。首先我们需要在定义这个权限时,告诉系统,“系统管理”这个权限是数据集权限。 2。数据集权限,我们主要分如下图 3。可以给吉日嘎拉这个用户配置“系统管理”权限的数据集范围,例如,他只能管理自己所在的部门。 4。我们给这个用户设置可以管理某些部门,还有可以管理某些角色,当然也可以设置到可以管哪些用户为止。 5。运行我们的程序,可以获得,吉日嘎拉这个用户,可以管理哪些组织机构、管理哪些角色,管理哪些用户。 可以通过3种方式获得数据,在自己的程序里进行过滤数据用。 A:可以获得能管理的数组权限范围是什么,例如全公司的?自己部门的?自己工作组的? B:可以获得能管理的String[] organizeIDs等数组,可以自己进行2次开发。 C:可以获得能管理的子查询SQL语句,可以在自己的程序里调用,可以自己进行2次开发。 例如,你用了我的权限组件,但是用户数据与您的业务数据不在同一个表里,那就无法直接执行SQL语句,需要通过调用相应的方法,获得 String[] organizeIDs 等,然后经过处理,再你的SQL语句里进行数据过滤,例如数据都在同一个数据库里,那又觉得获得 String[] organizeIDs 等麻烦,效率也不高,那我可以给你提供过滤数据用的子SQL语句,你可以在你的SQL语句里拼接,然后过滤数据,例如你的数据集的过滤数据要求很低,那你可以直接调用函数获得当前用户的某个权限范围的PermissionScope就可以了。 6。数据集权限的样例源码如下: 1 /**/ /// <summary> 2 /// 判断用户的数据集权限范围 3 /// SOA方式,就不用关心数据库什么的,只调用服务就可以了 4 /// </summary> 5 private void GetPermissionScopeBySOA() 6 { 7 // 一,用SOA的方式获得,面向服务的,不用关心数据库联接 8 9 // 这个是要进行判断的权限范围10 String permissionScopeCode = "SystemAdmin";1112 // 有某种权限的范围的组织机构主键数组13 String[] organizeIDs = PermissionService.Instance.GetOrganizeIDsByPermission(this.UserInfo, this.UserInfo.ID, permissionScopeCode);1415 // 有某种权限范围的角色主键数组16 String[] roleIDs = PermissionService.Instance.GetRoleIDsByPermission(this.UserInfo, this.UserInfo.ID, permissionScopeCode);17 18 // 有某种权限防卫的用户主键数组19 String[] userIDs = PermissionService.Instance.GetUserIDsByPermission(this.UserInfo, this.UserInfo.ID, permissionScopeCode);20 } 21 22 /**/ /// <summary>23 /// 判断用户的数据集权限范围24 /// 以组织机构为基础,公司的内部组织,外部客户,区域等都应该是属于组织机构的范畴里25 /// 例如公司划分了什么什么区域、什么分公司、什么什么子公司,办公地点,有哪些客户等等26 /// </summary> 27 private void GetPermissionScope() 28 { 29 // 二,直接调用程序的方式获得30 this.DbHelper.Open();31 32 // 开关变量,由于SQLServer 不支持递归调用,用组织机构的编号方式的上下级判断逻辑33 // BaseResourcePermissionScopeDao.GetChildrensByCode = true;3435 // 这个是要进行判断的权限范围36 String permissionScopeCode = "SystemAdmin";3738 BaseResourcePermissionScopeDao resourcePermissionScopeDao = new BaseResourcePermissionScopeDao(this.DbHelper, this.UserInfo);39 // 权限范围的判断40 PermissionScope permissionScope = resourcePermissionScopeDao.GetUserPermissionScope(this.UserInfo.ID, permissionScopeCode);4142 // 组织机构43 this.lblOrganizeSQL.Text = resourcePermissionScopeDao.GetOrganizeIDsSql(this.UserInfo.ID, permissionScopeCode);44 String[] organizeIDs = resourcePermissionScopeDao.GetOrganizeIDs(this.UserInfo.ID, permissionScopeCode);45 this.lblOrganizeIDs.Text = BaseBusinessLogic.ObjectsToList(organizeIDs);4647 // 获取组织机构名称48 this.lblOrganize.Text = String.Empty;49 BaseOrganizeDao organizeDao = new BaseOrganizeDao(this.DbHelper, this.UserInfo);50 foreach(string id in organizeIDs)51 { 52 this.lblOrganize.Text += organizeDao.GetProperty(id, BaseOrganizeTable.FieldFullName) + ",";53 }54 55 // 角色56 this.lblRoleSQL.Text = resourcePermissionScopeDao.GetRoleIDsSql(this.UserInfo.ID, permissionScopeCode);57 String[] roleIDs = resourcePermissionScopeDao.GetRoleIDs(this.UserInfo.ID, permissionScopeCode);58 this.lblRoleIDs.Text = BaseBusinessLogic.ObjectsToList(roleIDs);5960 // 用户61 this.lblUserSQL.Text = resourcePermissionScopeDao.GetUserIDsSql(this.UserInfo.ID, permissionScopeCode);62 String[] userIDs = resourcePermissionScopeDao.GetUserIDs(this.UserInfo.ID, permissionScopeCode);63 this.lblUserIDs.Text = BaseBusinessLogic.ObjectsToList(userIDs);64 65 this.DbHelper.Close();66 }
程序源码及数据库下载: 下载相应的数据库点这里: 下载相应的演示程序源码,请堤点这里: 导读: 淘宝店地址: 将权限管理、工作流管理做到我能力的极致,一个人只能做好那么很少的几件事情。