2

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

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

用户使用 JBoss 默认users.properties文件进行身份验证。在 JBoss 4.2.3 中,这工作得很好。现在在 JBoss 7 中,我得到一个授权异常:

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在为to设置记录器类别后,TRACE我发现 JBoss 7 显然希望<NOBODY>每个 EJB 方法都有一个默认角色,否则没有明确指定角色。从日志中:

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>

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

4

2 回答 2

5

这并不是对我的具体问题的真正答案,但它以更好的方式解决了问题。

在挖掘JBoss AS/Wildfly 源代码偶然发现评论中的博客文章后,我发现该<NOBODY>角色标识了来自 JBoss 的拒绝所有机制,当没有为 EJB 方法指定角色时自动设置该机制. 可以通过设置在 EJB 子系统配置中更改此行为(如博客文章中所述):

<missing-method-permissions-excluded-mode>false</missing-method-permissions-excluded-mode>
于 2013-10-02T05:30:30.977 回答
1

为了解决上述问题,我在 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>
于 2018-11-29T14:18:03.930 回答