基于操作+角色的授权方案(具体实现篇)

基于操作+角色的授权方案 思路篇

 

接上文,上一篇随笔说了基于操作+角色授权方案的设计思路,本随笔谈谈如何实现,可以方便高效的使用此方案。

在这套授权方案中角色是用户可配置的,而操作是死的,我们在程序中实现了什么功能就有什么样的操作,所以我们充分利用这一点,为了使用方便我们将操作作为PageBase(项目中统一的Page基类)的Attribute来定义,然后在PageBase对应页面执行PreLoad事件时读取此页面上定义的Attribute属性中的操作,然后读取当前用户可执行的操作,对比得到用户是否有访问该页面的权限。
ActionsAttribute的实现很简单,就是定义了一个只读的string数组来存放页面功能中的操作。其实现如下:

[global::System.AttributeUsage(AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
public sealed class ActionsAttribute : Attribute
{
    
public readonly string[] PageActions;


    
public ActionsAttribute(params string[] actions)
    {
        PageActions 
= actions;
    }
}

我们需要在PageBase类中实现对ActionsAttribute(即当前页实现操作)的读取和对权限的判断,关键代码如下

PageBase中的实现
大家都知道读取Attribute是通过反射来做的,其性能会有问题,所以我们生命了一个静态的成员变量_pageActionsDict来保存解析出来的Attribute和Page类型的对应字典,这样所有页面的Attribute都仅需要读取一遍,对性能几乎没有影响。
在上面的方法中我们使用了LoginUser.CanDoAction方法,其中LoginUser是PageBase的一个属性,表示当前登录的用户,在User类中有对当前用户权限的判断。其相关代码如下:
User类中判断权限部分

这两个方法没有具体实现,不过有了设计思路实现是很简单的。

我们在具体使用中,就是直接给具体的Page类加上Attribute了,如下示例代码:

    [Actions(ActionsConst.EnterAdmin)]
    
public partial class Default : PageBase
    {
        
protected void Page_Load(object sender, EventArgs e)
        {
            
        }
    }

 

其中ActionsConst是系统中所有操作的常量定义类。

全文完。


posted @ 2008-11-21 09:18  玉开  阅读(4280)  评论(23编辑  收藏  举报