我有一个带有多个 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