Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用AspectJ建议EJB授权调用?_Java_Jboss_Ejb_Aspectj_Load Time Weaving - Fatal编程技术网

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

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

我试图记录所有EJB方法授权调用,但在配置要调用的方面时遇到了一些困难。我已经创建了尽可能通用的切入点来直接向EJB提供建议,但我没有成功

首先,我需要记录任何失败的授权

我的应用服务器是JBoss 4.2.1GA,但它自己的授权方面/拦截器似乎优先于我自己的切入点。我不完全清楚为什么我将切入点设置为
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>