< meta http-equiv="description" content="我曾经在想,怎么样控制权限比较好呢。曾经尝试过控制到页面,很方便,但不细致;也曾想过控制到按钮,很麻烦,也不灵活。最终我决定,还是控制到方法吧(实际是控制到类),所以现在这套权限管理方案便产生了。只需要继承与一个类,并给它设置一个attribute,就那么简单。这就是Lm.Common.Auth命名空间提供的权限控制方案。"/>

C#用户权限控制架构,可以控制到类

[来源] 达内    [编辑] 达内   [时间]2012-09-18

我曾经在想,怎么样控制权限比较好呢。曾经尝试过控制到页面,很方便,但不细致;也曾想过控制到按钮,很麻烦,也不灵活。最终我决定,还是控制到方法吧(实际是控制到类),所以现在这套权限管理方案便产生了。只需要继承与一个类,并给它设置一个attribute,就那么简单。这就...

我曾经在想,怎么样控制权限比较好呢。曾经尝试过控制到页面,很方便,但不细致;也曾 过控制到按钮,很麻烦,也不灵活。最终我决定,还是控制到方法吧(实际是控制到类),所以现在这套权限管理方案便产生了。只需要继承与一个类,并给它设置一个attribute,就那么简单。这就是Lm.Common.Auth命名空间提供的权限控制方案。

< p style="font-size: 13px; line-height: 1.4; margin: 5px auto; text-indent: 0px; color: rgb(0, 0, 0); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: -webkit-auto; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); ">以下是对这种权限控制方案的简单描述,以及整理出来的最简代码。

< p style="font-size: 13px; line-height: 1.4; margin: 5px auto; text-indent: 0px; color: rgb(0, 0, 0); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: -webkit-auto; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); ">完整代码请访问我的开源项目,http://lmcommon.codeplex.com/

< p style="font-size: 13px; line-height: 1.4; margin: 5px auto; text-indent: 0px; color: rgb(0, 0, 0); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: -webkit-auto; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); "> OperationBase类,是权限控制的核心。如果一个类ClassA继承与OperationBase,那么ClassA提供的所有方法,都将受到OperationBase的权限控制。

< p style="font-size: 13px; line-height: 1.4; margin: 5px auto; text-indent: 0px; color: rgb(0, 0, 0); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: -webkit-auto; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); ">所谓权限控制的核心,就是判断一个用户标识和一个权限标识之间的对应关系。

< p style="font-size: 13px; line-height: 1.4; margin: 5px auto; text-indent: 0px; color: rgb(0, 0, 0); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: -webkit-auto; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); ">OperationBase类对其子类的以下两个要求,使得OperationBase类收集到这个两个标识。

< p style="font-size: 13px; line-height: 1.4; margin: 5px auto; text-indent: 0px; color: rgb(0, 0, 0); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: -webkit-auto; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); ">1、OperationBase类要求其子类必须向其构造函数提供一个用户标识;

< p style="font-size: 13px; line-height: 1.4; margin: 5px auto; text-indent: 0px; color: rgb(0, 0, 0); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: -webkit-auto; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); ">2、OperationBase类要求其子类必须有一个OperationAttribute特性,并在OperationAttribute中提供权限标识。

< p style="font-size: 13px; line-height: 1.4; margin: 5px auto; text-indent: 0px; color: rgb(0, 0, 0); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: -webkit-auto; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); ">权限控制执行过程(子类以CreateOrder【创建订单类】为例):

< p style="font-size: 13px; line-height: 1.4; margin: 5px auto; text-indent: 0px; color: rgb(0, 0, 0); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: -webkit-auto; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); ">1、向CreateOrder类的构造函数传递一个用户标识,以便构造一个CreateOrder类的实例;

< p style="font-size: 13px; line-height: 1.4; margin: 5px auto; text-indent: 0px; color: rgb(0, 0, 0); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: -webkit-auto; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); ">2、由于CreateOrder继承与OperationBase,OperationBase的构造函数必然会被调用;

< p style="font-size: 13px; line-height: 1.4; margin: 5px auto; text-indent: 0px; color: rgb(0, 0, 0); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: -webkit-auto; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); "> 3、在OperationBase的构造函数中,检查CreateOrder是否具有OperationAttribute特性,如果,提取出其中的权限标识,如果没有,抛出异常,终止构造过程;

< p style="font-size: 13px; line-height: 1.4; margin: 5px auto; text-indent: 0px; color: rgb(0, 0, 0); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: -webkit-auto; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); "> 4、收集到用户标识和权限标识后,去数据库中比对,如果此用户,没有权限,抛出异常,终止构造过程;

< p style="font-size: 13px; line-height: 1.4; margin: 5px auto; text-indent: 0px; color: rgb(0, 0, 0); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: -webkit-auto; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); ">5、CreateOrder的实例无法构造,其提供的方法,自然无法执行,以达到权限控制的目的。

< p style="font-size: 13px; line-height: 1.4; margin: 5px auto; text-indent: 0px; color: rgb(0, 0, 0); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: -webkit-auto; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); ">

< div style="background-color: rgb(245, 245, 245); font-family: 'Courier New'; font-size: 12px; border: 1px solid rgb(204, 204, 204); padding: 5px; overflow: auto; margin: 5px 0px; color: rgb(0, 0, 0); font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; " class="cnblogs_code">
using
 System; using


 System.Collections.Generic; using System.Linq; 
using System.Text;  


namespace Lm.Common.Auth {     ///
 <summary>

    /// 权限控制的核心类     
/// </summary>

    public abstract
 class OperationBase     {         
///

 <summary>
        
        /// </summary>
        /// <param name="user">
用户编号</param>

        protected OperationBase(string
 user)         {             //


获取子类的权限编号

            var attrList = this
.GetType().GetCustomAttributes(typeof(OperationAttribute), false
);             if
 (attrList.Length != 1

)             { throw
 new Exception("
当前类

" + this
.GetType().FullName + "没有OperationAttribute特性
"

); }             var
 attr = (OperationAttribute)attrList.Single();             var
 operationCode = attr.OperationCode;             //


拿到了权限编号,和参数中的用户编号,             //
就可以去数据库中比较,看看该用户是不是具有这个权限,             //


如果没有权限,抛出异常,中断权限实际操作类的构造

        }     }     ///
 <summary>

    /// 这个类用来存储权限编号     
/// </summary>

    public sealed
 class OperationAttribute : Attribute     {         


public string OperationCode { get
; set; }          


private OperationAttribute()         { }         public
 OperationAttribute(string operationCode)         {             
this.OperationCode = operationCode;         }     }     
/// <summary>

    ///
 这个类提供创建订单的功能,这个类的权限编号是“CreateOrder”     ///
 </summary>


    [Operation("CreateOrder
")]     
public

 class CreateOrder : OperationBase     {         
public CreateOrder(string


 user)             : base(user)         { }         
public void


 Work1()         {             //完成某些功能

        }         public
 void Work2()         {             
//

完成某些功能

        }     } }

资源下载