Attribute应用--权限验证

权限验证是大多数项目开发中必不可少的一项,特别是大型项目其权限分得很细验证更为复杂。所以更好更便捷的方式来进行权限验证是一件很重要的事情,大多数的人都是在调用的方法前加了一个验证的语句,这样的写法虽然可以达到目的但并不够直观也不易阅读。下面介绍下怎么使用Attribute来达到权限验证的目的。

 

首先介绍几个类:

 

1.ContextAccessPowerValidAttribute

 

ContextAccessPowerValidAttribute

 

ContextAccessPowerValidAttribute类继承于ContextAttribute类,将ContextAccessPowerValidProperty 添加到上下文属性列表中

 

2.ContextAccessPowerValidProperty

 

ContextAccessPowerValidProperty

 

ContextAccessPowerValidProperty继承于IContextProperty、IContributeObjectSink,用于返回权限验证消息接收器的实例ContextAccessPowerValidSink

 

3.ContextAccessPowerValidSink

 

ContextAccessPowerValidSink

 

ContextAccessPowerValidSink继承于IMessageSink,用于通过反射取得业务层方法上所有的验证权限属性BaseAccessPowerAttribute,并逐个进行验证。

 

4.BaseAccessPowerAttribute

 

BaseAccessPowerAttribute

 

抽象类BaseAccessPowerAttribute继承于Attribute,用于验证调用方法所需要的权限,具体的验证规则与用户信息由继承类编写。

 

5。AccessPowerAttribute

 

AccessPowerAttribute

 

AccessPowerAttribute继承于BaseAccessPowerAttribute,重写了基类的验证规则和当前用户信息的属性。

 

6.BLLBase

 

BLLBase

 

业务层基类BLLBase继承于ContextBoundObject,并定义了当前用户信息。

 

 7.NewsBLL

 

NewsBLL

 

业务类NewsBLL继承于BLLBase,用于News模块业务逻辑的调用

 

8.AccessUserInfo

 

AccessUserInfo

 

AccessUserInfo,用户信息,存储了用户名和用户权限。

 

以上就是主要的类,现在来说明这些类是如何运作的。

 

当初始化业务类NewsBLL,并调用其任意一个方法时ContextAccessPowerValidSink类中的SyncProcessMessage方法会被调用,方法ValidAccessPowers在SyncProcessMessage中被调用了。

 

ValidAccessPowers

 

在ValidAccessPowers方法中将参数msg转换为IMethodCallMessage类型的变量call。然后根据call的属性call.MethodBase可以取得被调用的方法的信息,由此可以得到该方法中所有继承于BaseAccessPowerAttribute的属性。

 

设置属性:

        [AccessPowerAttribute(AccessPower.User_Add)]//设置验证属性和所需要的权限,以下同
        public void Insert(NewsInfo dataInfo)
        {
            MessageBox.Show(
"Insert成功");
        }

 

取得属性:

BaseAccessPowerAttribute[] mustPowers = call.MethodBase.GetCustomAttributes(typeof(BaseAccessPowerAttribute), falseas BaseAccessPowerAttribute[];

 

然后遍历mustPowers数组,通过BaseAccessPowerAttribute属性的方法Valid进行验证,有一个属性验证不通过则抛出异常,由此来终止方法的调用保证其不被越权调用。

 

复制代码
            foreach (BaseAccessPowerAttribute mustPower in mustPowers)
            {
                
//验证未通过则抛出异常
                if (mustPower.Valid(call) == false)
                {
                    
throw new NotEnoughPowerException(mustPower.UserName, call.MethodName);
                }
            }
复制代码

 

调用Valid方法时将call作为参数传递到验证方法中是为了可以取得调用需验证的权限时使用的参数。如:

 

复制代码
        NewsBLL newsBLL = new NewsBLL();

        newsBLL.Insert(
new NewsInfo { Title = "title", Content = "content" });

        
public override bool Valid(IMethodCallMessage callMsg)//重写AccessPowerAttribute的验证方法
        {
            NewsInfo newsInfo 
= (NewsInfo)callMsg.Args[0]; //这样就可以取得调用newsBLL.Insert时用的参数
        }
复制代码

 

在一些更复杂的验证规则中就可以用到。如验证News是否是当前用户发布的。

 

可能说得不太清楚,大家可以下载示例运行看看。示例项目 

posted on   Fenrir  阅读(3255)  评论(18编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述

导航

< 2008年9月 >
31 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 1 2 3 4
5 6 7 8 9 10 11
点击右上角即可分享
微信分享提示