权限管理、用户权限系统、开源用户权限系统、信息化建设标准基础数据管理平台
代码改变世界

疯狂.NET 通用权限设计 C\S后台管理,B\S前台调用源码样例程序源码下载之 --- 数据集权限

2009-09-09 16:06  通用C#系统架构  阅读(15738)  评论(58编辑  收藏  举报

博客上有人问我:
问个技术上的问题,你指定的角色是对能操作的行为而言,但如果权限也涉及数据怎么办?比如上面,若干个管理员,高虹水厂,东蓝科技,如果这个管理员只能操作高虹水厂的数据,那个管理员只能操作东蓝科技的数据,在你的框架下怎么支持?当然也许这个例子不太好,一般来说,高虹水厂和东蓝科技的数据不会混合的,但你应该明白我上面的意思。

这个问题是属于,
 数据集权限,也叫记录级权限的范畴,以下文章主要围绕上面的提问开展。

有人说:吉日你的权限太复杂
我回答:判断一个权限,只需要一行代码,还不行吗?难道非要孙悟空式的神奇方法?才可以满足你的要求?你又想简单,又要有足够的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";
11
12            // 有某种权限的范围的组织机构主键数组
13            String[] organizeIDs = PermissionService.Instance.GetOrganizeIDsByPermission(this.UserInfo, this.UserInfo.ID, permissionScopeCode);
14
15            // 有某种权限范围的角色主键数组
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;
34
35            // 这个是要进行判断的权限范围
36            String permissionScopeCode = "SystemAdmin";
37
38            BaseResourcePermissionScopeDao resourcePermissionScopeDao = new BaseResourcePermissionScopeDao(this.DbHelper, this.UserInfo);
39            // 权限范围的判断
40            PermissionScope permissionScope = resourcePermissionScopeDao.GetUserPermissionScope(this.UserInfo.ID, permissionScopeCode);
41
42            // 组织机构
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);
46
47            // 获取组织机构名称
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);
59
60            // 用户
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        }

程序源码及数据库下载:
下载相应的数据库点这里:/Files/jirigala/DotNet.Common_DB.rar
下载相应的演示程序源码,请堤点这里:/Files/jirigala/JiriSoft.Permission.rar

导读:
通过命名空间的细微差别,很直白的讲个人的那么点儿小算盘、个人的小利益与公司的大利益
疯狂.NET架构通用权限后台管理工具演示版2.0下载
通用权限实现的核心设计思想
一步步教你如何用疯狂.NET架构中的通用权限系统 -- 如何控制用户显示的菜单权限
一步步教你如何用疯狂.NET架构中的通用权限系统 -- 在页面中的调用权限讲解
一步步教你如何用疯狂.NET架构中的通用权限系统 -- 数据集权限的调用权限讲解
一步步教你如何用疯狂.NET架构中的通用权限系统 -- 分级管理

淘宝店地址:
http://list.taobao.com/browse/0/n-8ddf3d8a90550373fa749337efe29f03---------------40--commend-0-all-0.htm


C# ASP.NET 通用权限设计、通用权限管理、通用权限组件、单点登录、集中式权限管理、统一授权体系、分级管理分级授权


微信扫一扫加好友