首页 > 编程语言 >C#开发之WPF项目中权限控制的实现(attribute)

C#开发之WPF项目中权限控制的实现(attribute)

时间:2024-04-07 15:14:35浏览次数:40  
标签:控件 C# attribute prop AccessControlledPage Attribute WPF 权限 public

1 功能描述

实现一个权限检查机制,以确保用户根据其权限级别进行相应的操作。定义四级权限:Operator, Maintenance, Supervisor, Administrator,每一级权限都有其特定的操作范围。能够根据用户的权限级别判断用户是否有权执行特定的操作。

2 设计分析

如果实现为接口形式,那么每次在需要控制权限的地方,都需要显式调用接口,并且传入当前操作的required_level,非常麻烦且不利于项目的扩展和维护。因此需要设计一个更为易用的权限控制方式。

经过查询网络资料,在.Net web应用中,常常使用MVC提供的AuthorizeAttribute来进行权限控制。虽然wpf项目中似乎并没有相关的特性提供,但可以根据属性注入的思想自己实现一个类似功能。

c# MVC利用AuthorizeAttribute验证用户是否登录

3 实现方法

3.1 自定义权限属性

   [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
   public class ControlAccessAttribute : Attribute
   {
       public int RequiredLevel { get; private set; }
   
       public ControlAccessAttribute(int requiredLevel)
       {
           RequiredLevel = requiredLevel;
       }
   }

3.2 自定义Page并重写

具体地,自定义AccessControlledPage继承自Page,重写onInitialized函数。在页面初始化时,获取当前用户等级,并获取包含ControlAccessAttribute的控件,根据其属性(所需权限等级)重设控件的可见性/可用性。

public class AccessControlledPage : Page
{
    protected override void OnInitialized(EventArgs e)
    {
        base.OnInitialized(e);
        ApplyControlAccess();
    }

    private void ApplyControlAccess()
    {
        int currentUserLevel = 0;

        var propertiesWithAttributes = this.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public)
    .Select(prop => new { Property = prop, Attribute = prop.GetCustomAttribute<ControlAccessAttribute>() })
    .Where(prop => prop.Attribute != null);

        foreach (var prop in propertiesWithAttributes)
        {
            var control = prop.Property.GetValue(this) as UIElement;
            if (control != null)
            {
                //control.Visibility = currentUserLevel >= prop.Attribute.RequiredLevel ? Visibility.Visible : Visibility.Collapsed;
                control.IsEnabled = currentUserLevel >= prop.Attribute.RequiredLevel;
            }

        }
    }
}

3.3 使用属性修饰相关控件

  • 所有需要权限控制的页面必须继承自AccessControlledPage

  • xaml文件中需要将Page改为重写的AccessControlledPage

  • 所有需要权限控制的控件,需要进行后置声明,并使用属性修饰。

使用实例如下:

public partial class ControlPage : AccessControlledPage
{
    [ControlAccess(2)]
    public Wpf.Ui.Controls.Button FanButton_ => FanButton;
    
    // ...
}

4 运行实例

设置当前用户权限等级为0,而当前button所需权限为2,可见该控件已经是无法点击的状态:

效果示例

标签:控件,C#,attribute,prop,AccessControlledPage,Attribute,WPF,权限,public
From: https://www.cnblogs.com/rthete/p/18119055

相关文章

  • 单片机 Mooc 课程讨论区问题集锦
    单片机Mooc课程讨论区问题集锦单片机和嵌入式系统的根本区别和联系是什么?答:单片机和嵌入式系统的根本区别在于是否使用操作系统,没有采用OS的32位的ARM处理器就是32位单片机。在没有学过微机原理的情况下学习单片机要注意哪些问题?答:该课程就是给没有计算机基础的......
  • 从数组创建二叉树-Leetcode测试用
    Leetcode里和二叉树相关的题目,都是用一个数组表示二叉树的,而这个数组是按照层次优先顺序给出的,连其中的空结点也表示了出来,刚好就是2^N-1个结点,N表示层数。但数组毕竟无法和二叉树一样具有链式结构,无法进行算法测试,因此尝试直接通过这样的数组构建二叉树。通过数组创建这样的二......
  • .net core中EF core的环境搭建
    //数据上下文MyDbContext.csusingMicrosoft.EntityFrameworkCore;namespaceLearn00.Models{publicclassMyDbContext:DbContext{//摘要://把Employees{get;set;},理解成是一个容器//用来存放Employee类型的实体,该实......
  • windows服务器间文件同步--Syncthing
    一、说明:Syncthing免费且开源,跨平台支持Windows、Mac、Linux、Android等主流平台,除了PC、手机以外,在部分路由器、树莓派等硬件上都能轻松运行,它将以网页版的形式呈现,并且Syncthing还提供了中文界面的支持。二、下载官网下载地址:https://syncthing.net/downloads/按照自......
  • 使用miniforge平替anaconda,重建airflow服务
    背景因公司通知不能使用anaconda,可以采用miniforge作为开源平替,因之前环境搭建使用的就是anaconda,当前需要卸载并替换成miniforge。那为什么一定要用这个呢,其实也不是一定,而是用这个搭建环境比较省事,如果没用这个,我当前环境的python版本过低,解决这个问题耗费的时间会更久,所以最......
  • [UTCTF2020]zero
    [UTCTF2020]zero附件是一个txt文件,打开来看文字好像有重影放入kali中发现是零宽字符隐写网站在线解码下得到flagutflag{whyNOT@sc11_4927aajbqk14}......
  • Oracle 提取第5条到第10条的数据
    DEMO --创建表createtablecux_num_temp(namevarchar2(100),agenumber,addtimedate);---插入测试数据insertintocux_num_temp(name,age,addtime)values('123',99,sysdate);insertintocux_num_temp(name,age,addtime)values(&#......
  • 【WEEK6】Learning Objectives and Summaries【MySQL】【English Version】
    LearningObjectives:TwoweekstofinishlearningMySQL-WeektwoLearningContent:Referencevideotutorials【狂神说Java】MySQL最新教程通俗易懂QuerydatabyDQLMySQLfunctionsMD5encryptionTransactionsLearningtimeandoutputs:Week6MON~WED,SUN......
  • php对接微信公众号h5时动态获取config配置参数
    获取配置参数方法functiongetWeixinConfigData($url){$appId="公众号appid";$secret="公众号secret";//获取access_token$token=S('WX_TOKEN');if(!$token){$getTokenUrl='https://api.weixin.qq.com/cgi-......
  • [WesternCTF2018]shrine
    [WesternCTF2018]shrine代码整理后得到importflask<!--more-->importosapp=flask.Flask(__name__)app.config['FLAG']=os.environ.pop('FLAG')@app.route('/')defindex():returnopen(__file__).read()@app.route(......