`
feipigwang
  • 浏览: 746569 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

EsbAOP应用--权限管理

 
阅读更多
前文介绍了异常关闭器的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的时候却可以正常进行。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics