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


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

     

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

    在这套授权方案中角色是用户可配置的,而操作是死的,我们在程序中实现了什么功能就有什么样的操作,所以我们充分利用这一点,为了使用方便我们将操作作为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是系统中所有操作的常量定义类。

    全文完。


  • 相关阅读:
    spring框架面试
    为什么人们都讨厌开会?
    使用IDEA连接远程主机上的Redis失败. 抛出redis.clients.jedis.exceptions.JedisConnectionException: Failed connecting to host xxx
    192405实验六 Metasploit攻击渗透实践
    实验七 网络欺诈与防范
    gradle implementation、compileOnly、api
    C# 数组对比和字符串分割后转成指定类型的数组
    sql 2012 的 问题 无法 打开的原因。
    PhpStudyV8新版本_Win安装PHP扩展
    算法相关
  • 原文地址:https://www.cnblogs.com/yukaizhao/p/permission_action_role_shixian.html
Copyright © 2020-2023  润新知