一起谈.NET技术,一种简单的直观的高效的权限设计
2011-09-01 23:46
441 查看
大部分系统都有权限系统。一般来说,它能管控人员对某个否页面的访问;对某些字段、控件可见或者不可见。对gridview中的数据是否可删除、可添加、可新增等等。大部分人都把权限作为一个子系统独立出来。但是这里我不是想设计一个权限管理系统,网上的设计方案太多了,可以说每个开发人员都有自己的开发权限管理系统的想法和思路。
在这篇文章中,我先用简单的C#代码模仿一个用户的权限,再使用sql去模拟。这是一种很简单,很直观,很高效的方式去判定用户的权限。
C#:
好吧,先从最简单开始,定义一个用户(User)类,如下。
class User
{
bool CanDelete;
bool CanRead;
bool CanWrite;
bool CanModify;
bool CanCreate;
}
这里设计5个属性来管控用户的权限。我发现这样虽然很直观,但是不宜扩张。我们将权限独立出来,在看下面代码:
1 enum PermissionTypes : int
2 {
3 None = 0,
4 Read = 1,
5 Write = 2,
6 Modify = 4,
7 Delete = 8,
8 Create = 16,
9 All = Read | Write | Modify | Delete | Create
}
class User
{
public PermissionTypes Permissions = PermissionTypes.None;
}
我们先试用一下,你就能感觉到神奇之处:
1 //创建一个用户
2 User admin = new User();
3 admin.Permissions = PermissionTypes.Read
4 | PermissionTypes.Write
5 | PermissionTypes.Delete;
6
7 //验证权限
8 bool canRead = ((PermissionTypes.Read & admin.Permissions) == PermissionTypes.Read);
9 bool canWrite = ((PermissionTypes.Write & admin.Permissions) == PermissionTypes.Write);
bool canCreate = ((PermissionTypes.Create & admin.Permissions) == PermissionTypes.Create);
//查看结果
Console.WriteLine(canRead); //true
Console.WriteLine(canWrite); //true
Console.WriteLine(canCreate); //false
利用了'|'和'&'两个操作。但是这样看起来很是很别捏,初始化权限和验证权限用了一长串'|'和'&'运算的代码。很不直观。我在System.Enum中扩展一些方法供你调用,代码如下。
1 //是否存在权限
2 public static bool Has<T>(this System.Enum type, T value)
3 {
4 try
5 {
6 return (((int)(object)type & (int)(object)value) == (int)(object)value);
7 }
8 catch
9 {
return false;
}
}
//判断权限
public static bool Is<T>(this System.Enum type, T value)
{
try
{
return (int)(object)type == (int)(object)value;
}
catch
{
return false;
}
}
//添加权限
public static T Add<T>(this System.Enum type, T value)
{
try
{
return (T)(object)(((int)(object)type | (int)(object)value));
}
catch (Exception ex)
{
throw new ArgumentException(
string.Format(
"不能添加类型 '{0}'",
typeof(T).Name
), ex);
}
}
//移除权限
public static T Remove<T>(this System.Enum type, T value)
{
try
{
return (T)(object)(((int)(object)type & ~(int)(object)value));
}
catch (Exception ex)
{
throw new ArgumentException(
string.Format(
"不能移除类型 '{0}'",
typeof(T).Name
), ex);
}
}
使用一下:
1 //创建一个用户
2 User admin = new User();
3 PermissionTypes permissions = new PermissionTypes();
4 admin.Permissions = permissions;
5 //添加权限
6 admin.Permissions = admin.Permissions.Add(PermissionTypes.Create);
7 admin.Permissions = admin.Permissions.Add(PermissionTypes.Read);
8 admin.Permissions = admin.Permissions.Add(PermissionTypes.Write);
9 //判断权限
bool canRead = admin.Permissions.Has(PermissionTypes.Read); //true
bool canWrite = admin.Permissions.Has(PermissionTypes.Write); //true
bool canDelete = admin.Permissions.Has(PermissionTypes.Delete); //false
bool canCreate = admin.Permissions.Has(PermissionTypes.Create); //true
Console.WriteLine(canRead); //true
Console.WriteLine(canWrite); //true
Console.WriteLine(canDelete); //false
Console.WriteLine(canCreate); //true
Console.Read();
SQL:
大部分权限管理都是数据库的操作,好依照上面的思路,我在sqlserver里面模拟一下以上的操作,在sql中与或运算是很高效的。先设计两张表User和Permission。
1、获取有Read权限的所有用户:
select * from [User] where PermissionTypes&1 =1
Result:
2、获取有Delete权限的所有用户:
select * from [User] where PermissionTypes&8 =8
Result:
3、判断麒麟是否有有Delete权限
if exists (select * from [User] where Name='qilin' and PermissionTypes&8 =8)
print 'true'
else
print 'flase'
Result: flase
在这篇文章中,我先用简单的C#代码模仿一个用户的权限,再使用sql去模拟。这是一种很简单,很直观,很高效的方式去判定用户的权限。
C#:
好吧,先从最简单开始,定义一个用户(User)类,如下。
class User
{
bool CanDelete;
bool CanRead;
bool CanWrite;
bool CanModify;
bool CanCreate;
}
这里设计5个属性来管控用户的权限。我发现这样虽然很直观,但是不宜扩张。我们将权限独立出来,在看下面代码:
1 enum PermissionTypes : int
2 {
3 None = 0,
4 Read = 1,
5 Write = 2,
6 Modify = 4,
7 Delete = 8,
8 Create = 16,
9 All = Read | Write | Modify | Delete | Create
}
class User
{
public PermissionTypes Permissions = PermissionTypes.None;
}
我们先试用一下,你就能感觉到神奇之处:
1 //创建一个用户
2 User admin = new User();
3 admin.Permissions = PermissionTypes.Read
4 | PermissionTypes.Write
5 | PermissionTypes.Delete;
6
7 //验证权限
8 bool canRead = ((PermissionTypes.Read & admin.Permissions) == PermissionTypes.Read);
9 bool canWrite = ((PermissionTypes.Write & admin.Permissions) == PermissionTypes.Write);
bool canCreate = ((PermissionTypes.Create & admin.Permissions) == PermissionTypes.Create);
//查看结果
Console.WriteLine(canRead); //true
Console.WriteLine(canWrite); //true
Console.WriteLine(canCreate); //false
利用了'|'和'&'两个操作。但是这样看起来很是很别捏,初始化权限和验证权限用了一长串'|'和'&'运算的代码。很不直观。我在System.Enum中扩展一些方法供你调用,代码如下。
1 //是否存在权限
2 public static bool Has<T>(this System.Enum type, T value)
3 {
4 try
5 {
6 return (((int)(object)type & (int)(object)value) == (int)(object)value);
7 }
8 catch
9 {
return false;
}
}
//判断权限
public static bool Is<T>(this System.Enum type, T value)
{
try
{
return (int)(object)type == (int)(object)value;
}
catch
{
return false;
}
}
//添加权限
public static T Add<T>(this System.Enum type, T value)
{
try
{
return (T)(object)(((int)(object)type | (int)(object)value));
}
catch (Exception ex)
{
throw new ArgumentException(
string.Format(
"不能添加类型 '{0}'",
typeof(T).Name
), ex);
}
}
//移除权限
public static T Remove<T>(this System.Enum type, T value)
{
try
{
return (T)(object)(((int)(object)type & ~(int)(object)value));
}
catch (Exception ex)
{
throw new ArgumentException(
string.Format(
"不能移除类型 '{0}'",
typeof(T).Name
), ex);
}
}
使用一下:
1 //创建一个用户
2 User admin = new User();
3 PermissionTypes permissions = new PermissionTypes();
4 admin.Permissions = permissions;
5 //添加权限
6 admin.Permissions = admin.Permissions.Add(PermissionTypes.Create);
7 admin.Permissions = admin.Permissions.Add(PermissionTypes.Read);
8 admin.Permissions = admin.Permissions.Add(PermissionTypes.Write);
9 //判断权限
bool canRead = admin.Permissions.Has(PermissionTypes.Read); //true
bool canWrite = admin.Permissions.Has(PermissionTypes.Write); //true
bool canDelete = admin.Permissions.Has(PermissionTypes.Delete); //false
bool canCreate = admin.Permissions.Has(PermissionTypes.Create); //true
Console.WriteLine(canRead); //true
Console.WriteLine(canWrite); //true
Console.WriteLine(canDelete); //false
Console.WriteLine(canCreate); //true
Console.Read();
SQL:
大部分权限管理都是数据库的操作,好依照上面的思路,我在sqlserver里面模拟一下以上的操作,在sql中与或运算是很高效的。先设计两张表User和Permission。
1、获取有Read权限的所有用户:
select * from [User] where PermissionTypes&1 =1
Result:
2、获取有Delete权限的所有用户:
select * from [User] where PermissionTypes&8 =8
Result:
3、判断麒麟是否有有Delete权限
if exists (select * from [User] where Name='qilin' and PermissionTypes&8 =8)
print 'true'
else
print 'flase'
Result: flase
相关文章推荐
- 一种简单的直观的高效的权限设计
- 转:一种简单的直观的高效的权限设计
- 一种简单的直观的高效的权限设计
- 一种简单的直观的高效的权限设计
- 一种简单的直观的高效的权限设计
- 一种简单的直观的高效的权限设计
- 一种简单的直观的高效的权限设计
- 一种简单的直观的高效的权限设计
- 一种简单的直观的高效的权限设计
- 一种简单的直观的高效的权限设计
- 一种简单的直观的高效的权限设计
- 一种简单的直观的高效的权限设计
- 一起谈.NET技术,ASP.NET MVC 2生成动态表单的一种最简单的思路
- 一起谈.NET技术,C#权限管理和设计浅谈
- 一起谈.NET技术,ASP.NET MVC3 让依赖注入来的更简单(新补充了Ninject示例)
- 一起谈.NET技术,改善代码设计 —— 简化条件表达式(Simplifying Conditional Expressions)
- 一起谈.NET技术,系统架构技能之设计模式—代理模式
- 一起谈.NET技术,走向ASP.NET架构设计——第四章—业务层分层架构(中篇)
- 一起谈.NET技术,大型高性能ASP.NET系统架构设计
- 一起谈.NET技术,ASP.NET MVC & EF 构建智能查询 一、智能查询的需求与设计