• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

此文的v2版,请看下面的链接,带流程图

http://www.cnblogs.com/fantong/archive/2012/09/18/2690104.html

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

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

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

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

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

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

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

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

权限控制执行过程(子类以ClassA为例):

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

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

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

4、收集到用户标识和权限标识后,去数据库中比对,如果此用户,没有权限,抛出异常,终止构造过程; 5、ClassA的实例无法构造,其提供的方法,自然无法执行,以达到权限控制的目的。

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()
        {
            //完成某些功能
        }
    }
}

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
用C#生成随机中文汉字验证码的基本原理发布时间:2022-07-14
下一篇:
C语言程序设计(基础)最后一次作业--总结报告发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap