我尝试记录所有EJB方法授权调用,但是在配置我的方面时遇到一些困难。我已经尽可能地创建了我的切入点,直接建议我的EJB,但我没有成功。
首先,我需要记录任何失败的授权。
我的应用程序服务器是JBoss 4.2.1GA,但它自己的授权方面/拦截器似乎优先于我自己的切入点。我不完全确定为什么我将我的切入点设置为call()
而不是execute()
,期望我的建议会在其他任何事情之前执行,但这似乎不起作用。
我将LTW与AspectJ 1.6结合使用。
这是我的方面定义:
@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 {
...
...
}
当我在混合中添加调试器,并在第一个日志语句上设置断点时,它甚至不会被击中。记录器甚至不被调用。但我确实看到了JBoss'调用了org.jboss.ejb3.security.RoleBasedAuthorizationInterceptor
类。
我甚至尝试向aop.xml
添加优先权,但这失败了(并不奇怪):
<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>
有没有理由说JBoss&#39;我会在我之前调用拦截器吗?有什么方法可以建议我的EJB授权调用吗?