zoukankan      html  css  js  c++  java
  • #用户权限控制架构,可以控制到类

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

    以下是对这种权限控制方案的简单描述,以及整理出来的最简代码。

    完整代码请访问我的开源项目,http://lmcommon.codeplex.com/

    OperationBase类,是权限控制的核心。如果一个类ClassA继承与OperationBase,那么ClassA提供的所有方法,都将受到OperationBase的权限控制。

    所谓权限控制的核心,就是判断一个用户标识和一个权限标识之间的对应关系。

    OperationBase类对其子类的以下两个要求,使得OperationBase类收集到这个两个标识。

    1、OperationBase类要求其子类必须向其构造函数提供一个用户标识;

    2、OperationBase类要求其子类必须有一个OperationAttribute特性,并在OperationAttribute中提供权限标识。

    权限控制执行过程(子类以CreateOrder【创建订单类】为例):

    1、向CreateOrder类的构造函数传递一个用户标识,以便构造一个CreateOrder类的实例;

    2、由于CreateOrder继承与OperationBase,OperationBase的构造函数必然会被调用;

    3、在OperationBase的构造函数中,检查CreateOrder是否具有OperationAttribute特性,如果,提取出其中的权限标识,如果没有,抛出异常,终止构造过程;

    4、收集到用户标识和权限标识后,去数据库中比对,如果此用户,没有权限,抛出异常,终止构造过程;

    5、CreateOrder的实例无法构造,其提供的方法,自然无法执行,以达到权限控制的目的。

    复制代码
    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()
            {
                //完成某些功能
            }
        }
    }
    复制代码
    ============================================ 
    我的开源项目,都是平时的积累,对提高开发效率很有帮助。 
    http://lmcommon.codeplex.com/
     
  • 相关阅读:
    Activator.CreateInstance 反射实例化对象
    MVC Form提交
    Redis 下载
    List<T> 序列化与反序列化
    快速反射DataTable
    数据库特性
    javascript判断文件大小
    MD5
    HttpHelper
    cacheHelper
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2690431.html
Copyright © 2011-2022 走看看