他更多的服务于:花时间办事的人。
我更多的服务于:花钱办事的人。
不啰嗦,直奔主题,这些年,也看了很多人做的权限管理,也积极学习了别人解决问题的思路、方法,我不是天生就什么都会,我也是一直在学习别人的,站在别人的肩膀上,才有今天的那么一点点积累。
所谓见多识广吧,八仙过海各显神通,往往有些人用一些比较奇妙的、独特的思想解决实际问题,而且还解决得蛮有道理的,你想反驳人家也没的更好的说法,我今年就见过这么一个人,全部用角色来实现权限,你说人家外门邪道吧,还真不好这么说,只能说人家思路新颖,把问题解决得巧妙,你提问题出来吧,还真不太好驳倒人家,人家也都能解决问题。
用角色解决权限问题的意思是:我不判断这个人有什么权限,而是判断这个是属于哪个角色,这个角色又能做什么什么操作,例如他属于“财务人员”角色,就可以干什么了,他属于“公司管理层”又可以做哪些操作了,的确可以把日常开发中的问题也解决得很好,不能说人家这么解决问题有什么不好。
本文是接上一篇文章的,若上以篇没看过,请看如下文章:
疯狂.NET 通用权限设计 C\S后台管理,B\S前台调用源码样例程序源码下载之 --- 操作权限
若语言没能表达清楚我的意图,请看下图及配套的代码:
试验步骤如下:
(一)我通过疯狂.NET通用权限后台管理,给用户 吉日嘎拉,配置操作权限。
(2)把用户 吉日嘎拉,归属于 “咨询顾问”这个角色,当然也可以用英文命名的,为了简单我就用中文命名吧。
(3)我创建B\S项目,在 B\S 项目里引用我的通用权限的类库,劳动成果重复利用,不用每次都写了,
我的代码又可以在B\S项目里用,用可以在C\S项目里用,还可以支持多种数据库,这就是我骄傲的牛B之处。
(4)我在B\S项目,编写按角色解决权限问题的代码效果,意思是属于哪个角色,这个人可以干什么什么?而不是这个人由于有某个权限,可以做什么什么操作,跟传统的思想有些不一样,哈哈。
(5)我在B\S项目,按角色处理权限的运行效果如下。
当前用户属于“咨询顾问”角色里,未在“超级管理员”角色里。
(6)我在B\S项目,中写的源码如下,供您参考:
Code
1//------------------------------------------------------------
2// All Rights Reserved , Copyright (C) 2009 , Jirisoft , Ltd.
3//------------------------------------------------------------
4
5using System;
6using System.Collections.Generic;
7using System.Web;
8using System.Web.UI;
9using System.Web.UI.WebControls;
10
11namespace JiriSoft.Permission
12{
13 using DotNet.Common;
14 using DotNet.Common.Utilities;
15 using DotNet.Common.DbUtilities;
16 using DotNet.Common.Model;
17 using DotNet.Common.Business;
18 using DotNet.Common.Service;
19
20 /**////
21 /// _Default
22 ///
23 /// 修改纪录
24 ///
25 /// 版本:1.0 2009.09.06 JiRiGaLa 创建。
26 ///
27 /// 版本:1.0
28 ///
29 /// JiRiGaLa
30 /// 2009.09.06
31 ///
32 ///
33 public partial class _Default : BasePage
34 {
35 /**////
36 /// 用户的登录操作模拟
37 ///
38 private void UserLogin()
39 {
40 this.Login("jirigala", String.Empty);
41 }
42
43 /**////
44 /// 测试数据连接
45 ///
46 private void CheckDbConnection()
47 {
48 try
49 {
50 // 打开数据库
51 this.DbHelper.Open();
52 // 把数据库里的密码都设置为空
53 String sqlQuery = " UPDATE " + BaseUserTable.TableName + " SET " + BaseUserTable.FieldUserPassword + " = NULL ";
54 // 执行数据库更新语句
55 this.DbHelper.ExecuteNonQuery(sqlQuery);
56 // 事务开始
57 this.DbHelper.BeginTransaction();
58 // 事务递交
59 this.DbHelper.CommitTransaction();
60 }
61 catch
62 {
63 // 事务回滚
64 this.DbHelper.RollbackTransaction();
65 }
66 finally
67 {
68 // 关闭数据库连接
69 this.DbHelper.Close();
70 }
71 }
72
73 /**////
74 /// 显示当前用户的信息
75 ///
76 private void ShowCurrentUserInfo()
77 {
78 this.lblUserInfo.Text = "用户的主键:" + this.UserInfo.ID + "
"
79 + "用户名:" + this.UserInfo.Username + "
"
80 + "姓名:" + this.UserInfo.Realname + "
"
81 + "用户的公司主键:" + this.UserInfo.CompanyID + "
"
82 + "用户的公司名称:" + this.UserInfo.CompanyFullName + "
"
83 + "用户的部门主键:" + this.UserInfo.DepartmentID + "
"
84 + "用户的部门名称:" + this.UserInfo.DepartmentFullName + "
"
85 + "用户的工作组主键:" + this.UserInfo.WorkgroupID + "
"
86 + "用户的工作组名称:" + this.UserInfo.WorkgroupFullName + "
";
87
88 }
89
90 /**////
91 /// 获得用户的权限,操作权限
92 ///
93 private void GetPermission()
94 {
95 this.DbHelper.Open();
96
97 // 用户的操作权限
98 this.btnUserAdd.Enabled = this.IsAuthorized("User.Add");
99 this.btnUserDelete.Enabled = this.IsAuthorized("User.Delete");
100 this.btnUserExport.Enabled = this.IsAuthorized("User.Export");
101 this.btnUserImport.Enabled = this.IsAuthorized("User.Import");
102 this.btnUserPrint.Enabled = this.IsAuthorized("User.Print");
103 this.btnUserUpdate.Enabled = this.IsAuthorized("User.Update");
104 // 角色的操作权限
105 this.btnRoleAdd.Enabled = this.IsAuthorized("Role.Add");
106 this.btnRoleDelete.Enabled = this.IsAuthorized("Role.Delete");
107 this.btnRoleExport.Enabled = this.IsAuthorized("Role.Export");
108 this.btnRoleImport.Enabled = this.IsAuthorized("Role.Import");
109 this.btnRolePrint.Enabled = this.IsAuthorized("Role.Print");
110 this.btnRoleUpdate.Enabled = this.IsAuthorized("Role.Update");
111
112 this.DbHelper.Close();
113 }
114
115 /**////
116 /// 按用户所在的角色来处理权限,角色权限
117 ///
118 /// 虽然这么处理也蛮好的,但是总感觉灵活性有些不够,有些硬编码的感觉,
119 /// 程序的适应能力若,业务逻辑变了,需要修改的程序多一些。不管怎么说
120 /// 这是我见过的,比较有意思的权限处理模式,真的是有点儿怪,八仙过海。
121 ///
122 private void GetPermissionByRole()
123 {
124 // 例如系统管理员角色,可以做任何用户管理方面的操作,这里是调用了SOA模式的服务程序
125 if (PermissionService.Instance.IsInRole(this.UserInfo, this.UserInfo.ID, "系统管理员"))
126 {
127 this.btnUserAdd.Enabled = true;
128 this.btnUserDelete.Enabled = true;
129 this.btnUserExport.Enabled = true;
130 this.btnUserImport.Enabled = true;
131 this.btnUserPrint.Enabled = true;
132 this.btnUserUpdate.Enabled = true;
133 }
134
135 // 例如咨询顾问,不可以作任何角色管理方面的操作
136 if (PermissionService.Instance.IsInRole(this.UserInfo, this.UserInfo.ID, "咨询顾问"))
137 {
138 this.btnRoleAdd.Enabled = true;
139 this.btnRoleDelete.Enabled = true;
140 this.btnRoleExport.Enabled = true;
141 this.btnRoleImport.Enabled = true;
142 this.btnRolePrint.Enabled = true;
143 this.btnRoleUpdate.Enabled = true;
144 }
145 }
146
147 protected void Page_Load(object sender, EventArgs e)
148 {
149 if (!Page.IsPostBack)
150 {
151 // 测试数据连接
152 this.CheckDbConnection();
153 // 用户的登录操作模拟
154 this.UserLogin();
155 // 显示当前用户的信息
156 this.ShowCurrentUserInfo();
157 // 获得用户的权限,操作权限
158 // this.GetPermission();
159 // 按用户所在的角色来处理权限,角色权限
160 this.GetPermissionByRole();
161 }
162 }
163 }
164}
165
1//------------------------------------------------------------
2// All Rights Reserved , Copyright (C) 2009 , Jirisoft , Ltd.
3//------------------------------------------------------------
4
5using System;
6using System.Collections.Generic;
7using System.Web;
8using System.Web.UI;
9using System.Web.UI.WebControls;
10
11namespace JiriSoft.Permission
12{
13 using DotNet.Common;
14 using DotNet.Common.Utilities;
15 using DotNet.Common.DbUtilities;
16 using DotNet.Common.Model;
17 using DotNet.Common.Business;
18 using DotNet.Common.Service;
19
20 /**////
21 /// _Default
22 ///
23 /// 修改纪录
24 ///
25 /// 版本:1.0 2009.09.06 JiRiGaLa 创建。
26 ///
27 /// 版本:1.0
28 ///
29 ///
30 ///
31 ///
32 ///
33 public partial class _Default : BasePage
34 {
35 /**////
36 /// 用户的登录操作模拟
37 ///
38 private void UserLogin()
39 {
40 this.Login("jirigala", String.Empty);
41 }
42
43 /**////
44 /// 测试数据连接
45 ///
46 private void CheckDbConnection()
47 {
48 try
49 {
50 // 打开数据库
51 this.DbHelper.Open();
52 // 把数据库里的密码都设置为空
53 String sqlQuery = " UPDATE " + BaseUserTable.TableName + " SET " + BaseUserTable.FieldUserPassword + " = NULL ";
54 // 执行数据库更新语句
55 this.DbHelper.ExecuteNonQuery(sqlQuery);
56 // 事务开始
57 this.DbHelper.BeginTransaction();
58 // 事务递交
59 this.DbHelper.CommitTransaction();
60 }
61 catch
62 {
63 // 事务回滚
64 this.DbHelper.RollbackTransaction();
65 }
66 finally
67 {
68 // 关闭数据库连接
69 this.DbHelper.Close();
70 }
71 }
72
73 /**////
74 /// 显示当前用户的信息
75 ///
76 private void ShowCurrentUserInfo()
77 {
78 this.lblUserInfo.Text = "用户的主键:" + this.UserInfo.ID + "
"
79 + "用户名:" + this.UserInfo.Username + "
"
80 + "姓名:" + this.UserInfo.Realname + "
"
81 + "用户的公司主键:" + this.UserInfo.CompanyID + "
"
82 + "用户的公司名称:" + this.UserInfo.CompanyFullName + "
"
83 + "用户的部门主键:" + this.UserInfo.DepartmentID + "
"
84 + "用户的部门名称:" + this.UserInfo.DepartmentFullName + "
"
85 + "用户的工作组主键:" + this.UserInfo.WorkgroupID + "
"
86 + "用户的工作组名称:" + this.UserInfo.WorkgroupFullName + "
";
87
88 }
89
90 /**////
91 /// 获得用户的权限,操作权限
92 ///
93 private void GetPermission()
94 {
95 this.DbHelper.Open();
96
97 // 用户的操作权限
98 this.btnUserAdd.Enabled = this.IsAuthorized("User.Add");
99 this.btnUserDelete.Enabled = this.IsAuthorized("User.Delete");
100 this.btnUserExport.Enabled = this.IsAuthorized("User.Export");
101 this.btnUserImport.Enabled = this.IsAuthorized("User.Import");
102 this.btnUserPrint.Enabled = this.IsAuthorized("User.Print");
103 this.btnUserUpdate.Enabled = this.IsAuthorized("User.Update");
104 // 角色的操作权限
105 this.btnRoleAdd.Enabled = this.IsAuthorized("Role.Add");
106 this.btnRoleDelete.Enabled = this.IsAuthorized("Role.Delete");
107 this.btnRoleExport.Enabled = this.IsAuthorized("Role.Export");
108 this.btnRoleImport.Enabled = this.IsAuthorized("Role.Import");
109 this.btnRolePrint.Enabled = this.IsAuthorized("Role.Print");
110 this.btnRoleUpdate.Enabled = this.IsAuthorized("Role.Update");
111
112 this.DbHelper.Close();
113 }
114
115 /**////
116 /// 按用户所在的角色来处理权限,角色权限
117 ///
118 /// 虽然这么处理也蛮好的,但是总感觉灵活性有些不够,有些硬编码的感觉,
119 /// 程序的适应能力若,业务逻辑变了,需要修改的程序多一些。不管怎么说
120 /// 这是我见过的,比较有意思的权限处理模式,真的是有点儿怪,八仙过海。
121 ///
122 private void GetPermissionByRole()
123 {
124 // 例如系统管理员角色,可以做任何用户管理方面的操作,这里是调用了SOA模式的服务程序
125 if (PermissionService.Instance.IsInRole(this.UserInfo, this.UserInfo.ID, "系统管理员"))
126 {
127 this.btnUserAdd.Enabled = true;
128 this.btnUserDelete.Enabled = true;
129 this.btnUserExport.Enabled = true;
130 this.btnUserImport.Enabled = true;
131 this.btnUserPrint.Enabled = true;
132 this.btnUserUpdate.Enabled = true;
133 }
134
135 // 例如咨询顾问,不可以作任何角色管理方面的操作
136 if (PermissionService.Instance.IsInRole(this.UserInfo, this.UserInfo.ID, "咨询顾问"))
137 {
138 this.btnRoleAdd.Enabled = true;
139 this.btnRoleDelete.Enabled = true;
140 this.btnRoleExport.Enabled = true;
141 this.btnRoleImport.Enabled = true;
142 this.btnRolePrint.Enabled = true;
143 this.btnRoleUpdate.Enabled = true;
144 }
145 }
146
147 protected void Page_Load(object sender, EventArgs e)
148 {
149 if (!Page.IsPostBack)
150 {
151 // 测试数据连接
152 this.CheckDbConnection();
153 // 用户的登录操作模拟
154 this.UserLogin();
155 // 显示当前用户的信息
156 this.ShowCurrentUserInfo();
157 // 获得用户的权限,操作权限
158 // this.GetPermission();
159 // 按用户所在的角色来处理权限,角色权限
160 this.GetPermissionByRole();
161 }
162 }
163 }
164}
165
只要能抓老鼠,就是好猫,不管是白猫还是黑猫,所以我的权限解决方案里,这2种对权限的处理方式是都默认支持的,你用哪个思路解决问题,都可以,这个就看用户的习惯了。
我也不想跟任何人争个什么出来,我为赚钱努力写代码,我了养家糊口拼命工作,我不是什么高尚的人,我为生存奔波,你觉得我的文章还可以,给你带来了一些,那你就别忘记按推荐按钮,表示鼓励。
下载相应的数据库点这里: /Files/jirigala/DotNet.Common_DB.rar
下载相应的演示程序源码,请堤点这里: /Files/jirigala/JiriSoft.Permission.rar
导读:
通过命名空间的细微差别,很直白的讲个人的那么点儿小算盘、个人的小利益与公司的大利益
疯狂.NET架构通用权限后台管理工具演示版2.0下载
通用权限实现的核心设计思想
一步步教你如何用疯狂.NET架构中的通用权限系统 -- 如何控制用户显示的菜单权限
一步步教你如何用疯狂.NET架构中的通用权限系统 -- 在页面中的调用权限讲解
一步步教你如何用疯狂.NET架构中的通用权限系统 -- 数据集权限的调用权限讲解
标准权限模型RBAC与实际日常开发工作结合后,我对RBAC模型的改进优化研究成果分享
淘宝店地址:
http://shop59297253.taobao.com/
http://shop59297253.taobao.com/