在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
此文的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() { //完成某些功能 } } }
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论