如何使用AspectJ建议EJB授权调用?

时间:2016-08-22 18:51:58

标签: java jboss ejb aspectj load-time-weaving

我尝试记录所有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授权调用吗?

0 个答案:

没有答案