Java 如何使用AspectJ建议EJB授权调用?
我试图记录所有EJB方法授权调用,但在配置要调用的方面时遇到了一些困难。我已经创建了尽可能通用的切入点来直接向EJB提供建议,但我没有成功 首先,我需要记录任何失败的授权 我的应用服务器是JBoss 4.2.1GA,但它自己的授权方面/拦截器似乎优先于我自己的切入点。我不完全清楚为什么我将切入点设置为Java 如何使用AspectJ建议EJB授权调用?,java,jboss,ejb,aspectj,load-time-weaving,Java,Jboss,Ejb,Aspectj,Load Time Weaving,我试图记录所有EJB方法授权调用,但在配置要调用的方面时遇到了一些困难。我已经创建了尽可能通用的切入点来直接向EJB提供建议,但我没有成功 首先,我需要记录任何失败的授权 我的应用服务器是JBoss 4.2.1GA,但它自己的授权方面/拦截器似乎优先于我自己的切入点。我不完全清楚为什么我将切入点设置为call(),而不是execute(),期望我的建议会在其他任何事情之前执行,但这似乎不起作用 我在AspectJ 1.6中使用LTW 这是我的方面定义: @Pointcut("call( @(ja
call()
,而不是execute()
,期望我的建议会在其他任何事情之前执行,但这似乎不起作用
我在AspectJ 1.6中使用LTW
这是我的方面定义:
@Pointcut("call( @(javax.annotation.security..*) * *.*(..))")
public void securedEJB(){}
@Around( "securedEJB()" )
public Object logEJBAccess( ProceedingJoinPoint pjp ) throws Throwable{
logger.warn("EJB CHECK HERE!!!!!!!!!!!");
Object o = null;
try {
o = pjp.proceed();
} catch (Throwable e) {
logger.error("EJB Threw Exception " + e );
e.printStackTrace();
throw e;
}
return o;
}
然而,对于我所有的安全EJB方法,我得到了JBoss方面,它在我自己调用方法之前检查安全权限,因此这个建议永远不会运行
呼叫的一个示例是:
OrganizationManager om = (OrganizationManager)SessionBeanLocator.getSessionBean(OrganizationManager.class);
om.getThirdPartyOrgsForLogin( "asdf", null );
System.out.println( "OM" + om );
其中OM是EJB bean的接口:
@RolesAllowed({UserRole.ADMINISTRATOR})
@TransactionAttribute(TransactionAttributeType.NEVER)
public List getThirdPartyOrgsForLogin(String username, ContextInfo contextInfo) throws BusinessException {
...
...
}
当我将调试器添加到mix中,并在第一个log语句上设置断点时,它甚至不会被命中。记录器甚至没有被调用。但我确实看到JBoss的org.JBoss.ejb3.security.RoleBasedAuthorizationInterceptor类被调用
我甚至尝试向aop.xml
添加一个前置项,但失败了(毫不奇怪):
为什么JBoss的拦截器会在我之前被调用?有什么方法可以建议我的EJB授权调用吗?编写JBoss拦截器并将其包含在
standardjboss.xml
配置文件中会更容易。@Stevec我希望使其与容器无关,但如果不能,我很乐意寻找替代方案。你能提供更多关于jboss拦截器的细节吗?我以前从未有过编写EJB拦截器的必要/机会,因为JavaEE从版本5开始就已经有了实现EJB拦截器的标准方法,所以没有必要让它与容器无关。查看standardjboss.xml
,然后用谷歌搜索任何拦截器类。它是开源的,源代码会弹出。@SteveC谢谢。根据你的建议,我尝试了一些方法,但是RoleBaseAuthorizationInterceptor一直在我自己的interceptor之前启动,因此我无法捕获EJBAccessException
。再深入一点,我发现了一个ejb拦截器aop.xml
文件,它在堆栈顶部声明了这个拦截器。据我所知,“包装”/“击败”RoleBasedAuthorizationInterceptor的唯一方法是创建我自己的JBoss拦截器,但它在很大程度上变成了一个容器。JBoss拦截器的文档缺失。我希望通过AspectJ避免这种情况。显然AspectJ是AOP代码的内部,JBossAOP是围绕实际业务代码的AOP代码的外壳。根据文档“RoleBaseAuthorizationInterceptor检查调用方主体是否有权调用方法…”这一事实告诉您,JBoss interceptor在概念上也是一个call()
切入点,而不是execution()
切入点。如果你想“击败”这个拦截器,那就意味着你想真正破解JBoss的安全性。这就是你的目的吗?编写一个JBoss拦截器并将其包含在standardjboss.xml
配置文件中会更容易。@Stevec我希望它不受容器的影响,但如果我不能,我很乐意寻找替代方案。你能提供更多关于jboss拦截器的细节吗?我以前从未有过编写EJB拦截器的必要/机会,因为JavaEE从版本5开始就已经有了实现EJB拦截器的标准方法,所以没有必要让它与容器无关。查看standardjboss.xml
,然后用谷歌搜索任何拦截器类。它是开源的,源代码会弹出。@SteveC谢谢。根据你的建议,我尝试了一些方法,但是RoleBaseAuthorizationInterceptor一直在我自己的interceptor之前启动,因此我无法捕获EJBAccessException
。再深入一点,我发现了一个ejb拦截器aop.xml
文件,它在堆栈顶部声明了这个拦截器。据我所知,“包装”/“击败”RoleBasedAuthorizationInterceptor的唯一方法是创建我自己的JBoss拦截器,但它在很大程度上变成了一个容器。JBoss拦截器的文档缺失。我希望通过AspectJ避免这种情况。显然AspectJ是AOP代码的内部,JBossAOP是围绕实际业务代码的AOP代码的外壳。根据文档“RoleBaseAuthorizationInterceptor检查调用方主体是否有权调用方法…”这一事实告诉您,JBoss interceptor在概念上也是一个call()
切入点,而不是execution()
切入点。如果你想“击败”这个拦截器,那就意味着你想真正破解JBoss的安全性。这就是你的目的吗?
<aspectj>
<aspects>
<aspect name="security.ejbAccessLogger" />
<concrete-aspect name="security.ejbAccessLogger" precedence="security.logger.EJBAccessLogger,org.jboss.ejb3.security.RoleBasedAuthorizationInterceptor"/>
</aspects>
<weaver options="-verbose -showWeaveInfo -debug" />
</aspectj>