博客上有人问我: 问个技术上的问题,你指定的角色是对能操作的行为而言,但如果权限也涉及数据怎么办?比如上面,若干个管理员,高虹水厂,东蓝科技,如果这个管理员只能操作高虹水厂的数据,那个管理员只能操作东蓝科技的数据,在你的框架下怎么支持?当然也许这个例子不太好,一般来说,高虹水厂和东蓝科技的数据不会混合的,但你应该明白我上面的意思。 这个问题是属于, 数据集权限,也叫记录级权限的范畴,以下文章主要围绕上面的提问开展。
有人说:吉日你的权限太复杂。 我回答:判断一个权限,只需要一行代码,还不行吗?难道非要孙悟空式的神奇方法?才可以满足你的要求?你又想简单,又要有足够的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
/**/ /// <summary> 2
/// 判断用户的数据集权限范围 3
/// SOA方式,就不用关心数据库什么的,只调用服务就可以了 4
/// </summary> 5
private void GetPermissionScopeBySOA() 6 ![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{ 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 ![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**/ /// <summary>23
/// 判断用户的数据集权限范围24
/// 以组织机构为基础,公司的内部组织,外部客户,区域等都应该是属于组织机构的范畴里25
/// 例如公司划分了什么什么区域、什么分公司、什么什么子公司,办公地点,有哪些客户等等26
/// </summary> 27
private void GetPermissionScope() 28 ![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{ 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![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{ 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
}
程序源码及数据库下载: 下载相应的数据库点这里: 下载相应的演示程序源码,请堤点这里: 导读: 淘宝店地址: ![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
将权限管理、工作流管理做到我能力的极致,一个人只能做好那么很少的几件事情。