前文介绍了异常关闭器的AOP实现,而权限管理也是一个AOP可以大展拳脚的地方,下面就来看看如何使用EsbAOP实现权限管理。
首先要解决的问题是如何判断用户是否拥有调用某个操作的权限,这个判断是由各个应用程序自己实现了,为了统一对权限的判断,所以我们指定了接口IPermissionVerifier:
///<summary>
///IPermissionVerifier用于验证当前用户对目标类的目标方法的调用权限是否足够。
///如果需要使用Aop来进行权限管理,则要实现IPermissionVerifier接口。
///</summary>
publicinterfaceIPermissionVerifier
{
boolQualifiedToOperation(objectpermissionNeeded,stringdestClassFullName,stringdestMethodName);
}
其中,permissionNeeded通过应用于方法的特性的参数指定(后面可以看到),destClassFullName表示目标方法所在class的全称,destMethodName是目标方法名。
当用户的权限不满足条件时,对目标方法的调用将抛出PermissionLimittedException异常,该异常定义如下:
///<summary>
///当没有权限的用户调用某项操作时,将抛出此异常
///</summary>
[Serializable]
publicclassPermissionLimittedException:Exception
{
publicPermissionLimittedException()
{
}
publicPermissionLimittedException(stringmsg):base(msg)
{
}
publicPermissionLimittedException(stringmsg,ExceptioninnerException):base(msg,innerException)
{
}
}
注意,自定义异常必须是可序列化的,这样就可以保证异常通过remoting传递。
接下来,就可以实现权限方面PermissionAspect了。
///<summary>
///PermissionAspect权限方面,如果当前用户不够权限调用某个方法,则抛出PermissionLimittedException。
///aspectClassArgument:实现了IPermissionVerifier接口的类型
///aspectMethodArgument:操作所需的权限,由用户自定义
///</summary>
publicclassPermissionAspect:IAspect
{
publicPermissionAspect()
{
}
#regionIAspect成员
publicvoidPreProcess(IMethodCallMessagerequestMsg,objectaspectClassArgument,objectaspectMethodArgument)
{
TypeverifierType=(Type)aspectClassArgument;
TypedestType=typeof(IPermissionVerifier);
if(!destType.IsAssignableFrom(verifierType))
{
thrownewException("thePermissionVerifierTypeisinvalid!");
}
IPermissionVerifierpmVerifier=(IPermissionVerifier)Activator.CreateInstance(verifierType);
if(pmVerifier==null)
{
thrownewException("thePermissionVerifierTypeisinvalid!");
}
objectpmNeeded=aspectMethodArgument;
stringclassName=AopHelper.GetFullClassName(requestMsg);
stringmethodName=AopHelper.GetMethodName(requestMsg);
boolqualified=pmVerifier.QualifiedToOperation(pmNeeded,className,methodName);
if(!qualified)
{
thrownewPermissionLimittedException(string.Format("Currentuserhavenopermissiontocalldestmethod:{0}.{1}!",className,methodName));
}
}
publicvoidPostProcess(IMethodCallMessagerequestMsg,refIMethodReturnMessagerespond,objectaspectClassArgument,objectaspectMethodArgument)
{
//TODO:添加PermissionAspect.EnterpriseServerBase.Aop.ComplexAop.IAspect.PostProcess实现
}
#endregion
}
关于aspectClassArgument 和aspectMethodArgument的含义注释中已经给出了,如果要知道这两个参数是如何使用的,可以回顾EsbAOP实现中的说明。权限方面在前处理的时候,根据IPermissionVerifier判断用户是否满足权限要求,如果不满足,则引发PermissionLimittedException异常。
最后给出一个示例:
publicclassclass1
{
[STAThread]
staticvoidMain(string[]args)
{
try
{
Exampleexa=newExample();
exa.SayHello("sky");
exa.SayByebye("sky");
}
catch(Exceptionee)
{
Console.WriteLine(ee.Message);
}
Console.Read();
}
}
[Aspect(typeof(PermissionAspectWrap))]
publicclassExample:ContextBoundObject
{
[AspectSwitcher(typeof(PermissionAspectWrap),true,Permission.Common)]
publicvoidSayHello(stringname)
{
Console.WriteLine("Hello,"+name);
}
[AspectSwitcher(typeof(PermissionAspectWrap),true,Permission.Super)]//调用此方法需要Permission.Super权限
publicvoidSayByebye(stringname)
{
Console.WriteLine("Byebye,"+name);
}
}
#regionPermissionAspectWrap
publicclassPermissionAspectWrap:IAspectProcessorWrap
{
#regionIAspectProcessorWrap成员
publicTypeAspectProcessorType
{
get
{
returntypeof(PermissionAspect);
}
}
publicobjectAspectClassArgument
{
get
{
returntypeof(PermissionVerifier);
}
}
publicAspectSwitcherStateDefaultAspectSwitcherState
{
get
{
returnAspectSwitcherState.On;
}
}
#endregion
}
#endregion
#regionPermissionVerifier,Permission,Logger
publicclassPermissionVerifier:IPermissionVerifier
{
privatestaticintcurPermission=Permission.Common;
#regionIPermissionVerifier成员
publicboolQualifiedToOperation(objectpermissionNeeded,stringdestClassFullName,stringdestMethodName)
{
intdestPermission=(int)permissionNeeded;
if(PermissionVerifier.curPermission>destPermission)
{
returntrue;
}
returnfalse;
}
#endregion
}
publicclassPermission
{
publicconstintCommon=0;
publicconstintSuper=1;
}
#endregion
由于当前用户级别为Permission.Common,所以在调用SayByebye的时候会抛出异常,而在调用SayHello的时候却可以正常进行。
相关推荐
Coalesys PanelBar + R.a.d Treeview +Xml 构建的Asp.net 菜单和权限管理模块 突破屏蔽限制,自己的网站使劲弹新IE窗口 对页面SCROLLING的CSS不能生效原因 .Net 中IE使用WinForm控件的使用心得。 动态加载用户控件的...
在线教学质量评价系统可以方便和全面地收集教师教学工作的数据,提供师生网上评教的评分结果,快速集中收集各方面的评教信息,使教务管理部门能够及时了解教学动态和师资情况,为教务老师提供相关决策支持,为职称评聘提供教学工作质量的科学依据,同时减轻了教务老师的工作量。
python-3.10.7-amd64.zip
自研扩散模型高光谱修复网络 基于MST_Plus_Plus 网络改造。 试验数据 扩散模型loss初步测试降到了0.005,比不加扩散loss小了20倍, 训练入口 train_cos_img.py
企业数据治理之数据安全治理方案
这是历年的毕业设计的项目,基于Android的一个红外防盗报警。需要自己添加蜂鸣器和热释电的硬件访问服务。
短视频用户价值研究报告2022
基于springboot的java毕业&课程设计
可运行源码(含数据库脚本)+开发文档+lw(高分毕设项目) java期末大作业毕业设计项目管理系统计算机软件工程大数据专业 内容概要:首先在日常的出行中,老旧城区道路狭窄,容易造成车辆的堵塞,每天早晚,接送孩子的车辆数密集,会造成相应的交通堵塞情况。而同样的,在停车的管理上,一方面我国的停车场面积较少,停车位一位难求,特别是在现在的一些小区里,为了抢停车位而产生的矛盾也日益突出。另一方面在停车场的管理上也存在着较大的管理问题,进车容易出车难是当下的停车场所出现的主要问题。而现在的停车场管理系统眼花缭乱,效果水平也良莠不齐,停车场的管理是当下各大城市的公共设施发展的一大难题,而国家、各大省市也都开 全套项目源码+详尽文档,一站式解决您的学习与项目需求。 适用人群: 计算机、通信、人工智能、自动化等专业的学生、老师及从业者。 使用场景及目标: 无论是毕设、期末大作业还是课程设计,一键下载,轻松部署,助您轻松完成项目。 项目代码经过调试测试,确保直接运行,节省您的时间和精力。 其他说明: 项目整体具有较高的学习借鉴价值,基础能力强的可以在此基础上修改调整,以实现不同的功能。
基于springboot的java毕业&课程设计
微信小程序设计之相关行业源码及图文导入教程
网络游戏开发是一项很大的工程,需要很多综合性的知识。这对于刚刚入门的开发者来说很难理解。本论文从研究开发一个模仿泡泡堂网络游戏的例子出发,讲述网络游戏开发中用到的一些最基本的知识和设计思想,使大家清晰的理解游戏开发的过程。 整个设计中利用java中的swing编程,结合游戏的操作流程,对整个游戏进行精心的设计和大量的测试,实现游戏软件服务器端和客户端的开发,为玩家提供一个友好美观的操作界面,并添加聊天等功能以增加玩家之间的互动性,此外实现了可编辑场景地图的功能,使得游戏内容的更加丰富,玩家交互性更好,确保了游戏更具有趣味性、灵活性,以满足玩家对这款网络游戏的要求。
外东洪路中段.m4a
软考3333333333
附件是Elasticsearch 的全文搜索功能使用方法,文件绿色安全,请大家放心下载,仅供交流学习使用,无任何商业目的!
1.版本:matlab2014/2019a/2021a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
基于springboot的java毕业&课程设计
CCNP TSHOOT 642-832 Official Certification Guide
MySQL8.4.0 LTS(mysql-server_8.4.0-1ubuntu22.04_amd64.deb-bundle.tar)适用于Ubuntu 22.04 Linux (x86, 64-bit)