有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在JBoss7中为EJB方法设置默认角色?

我有一个多EJBJAR的EAR,它应该通过使用一个非常简单的身份验证机制来保护:每个用户只要通过身份验证,就可以访问每个EJB方法。因此,我通过将security-domain添加到jboss-app.xml文件到EAR中来保护EAR文件:

<jboss-app>
  <security-domain>my-security-domain</security-domain>
</jboss-app>

用户通过JBoss默认users.properties文件进行身份验证。在JBoss4.2.3中,这一切都很好。现在在JBoss7中,我得到了一个授权异常:

16:45:32,791 ERROR [org.jboss.as.ejb3.invocation] (EJB default - 2) JBAS014134: EJB Invocation failed on component MyServiceBean for method public abstract java.util.List mypackage.MyService.findAllFoo(): javax.ejb.EJBAccessException: JBAS014502: Invocation on method: public abstract java.util.List mypackage.MyService.findAllFoo() of bean: MyServiceBean is not allowed

在将org.jboss.security的记录器类别设置为TRACE之后,我发现JBoss7显然希望每个EJB方法上都有一个默认的<NOBODY>角色,而没有另外指定显式角色。从日志中:

16:45:32,791 TRACE [org.jboss.security.audit] (EJB default - 2) [Failure]Source=org.jboss.security.plugins.javaee.EJBAuthorizationHelper;Action=authorization;Exception:=PBOX000017: Acces denied: authorization failed ;Resource:=[org.jboss.security.authorization.resources.EJBResource:contextMap={policyRegistration=null}:method=public abstract java.util.List mypackage.MyService.findAllFoo():ejbMethodInterface=Remote:ejbName=MyServiceBean:ejbPrincipal=rschneider:MethodRoles=Roles(<NOBODY>,):securityRoleReferences=null:callerSubject=Betreff:
    Principal: org.jboss.remoting3.security.UserPrincipal@ce844325
    Principal: Roles(members:user)
    Principal: CallerPrincipal(members:org.jboss.remoting3.security.UserPrincipal@ce844325)
:callerRunAs=null:callerRunAs=null:ejbRestrictionEnforcement=false:ejbVersion=2.0];policyRegistration=null;

然后我尝试配置到JBoss的角色映射,以便每个用户都映射到这个<NOBODY>角色:

<security-domain name="my-security-domain" cache-type="default">
    <authentication>
        <login-module code="Remoting" flag="optional">
            <module-option name="password-stacking" value="useFirstPass"/>
        </login-module>
        <login-module code="RealmDirect" flag="required">
            <module-option name="password-stacking" value="useFirstPass"/>
        </login-module>
        <login-module code="RoleMapping" flag="optional">
            <module-option name="rolesProperties" value="${jboss.server.config.dir}/rolesMapping-roles.properties"/>
        </login-module>
    </authentication>
</security-domain>

rolesMapping-roles.properties文件的内容:

user=user,<NOBODY>

这是可行的,但我对这个解决方案感到非常不安。那么,有没有办法告诉JBoss7为每个EJB方法使用默认角色,例如user?我真的不想用@RolesAllowed("user")注释每个bean


共 (2) 个答案

  1. # 1 楼答案

    这并不是我具体问题的答案,但它以一种更好的方式解决了这个问题

    在深入研究了注释中的JBoss AS/Wildfly source codeupon a blog post之后,我发现<NOBODY>角色标识了JBoss中的deny all机制,当没有为EJB方法指定角色时,会自动设置该机制。在EJB子系统配置中,可以通过设置(如博文中所述)更改此行为:

    <missing-method-permissions-excluded-mode>false</missing-method-permissions-excluded-mode>
    
  2. # 2 楼答案

    为了解决上述问题,我在EJB子系统(standalone.xml)中将属性“default missing method permissions deny access”设置为“false”,详细信息如下:

    <subsystem xmlns="urn:jboss:domain:ejb3:5.0">
        ...
        <default-security-domain value="mysecuritydomain"/>
        <default-missing-method-permissions-deny-access value="false"/>
    
    </subsystem>