3

我有一个匿名的 WebService EJB - webservice 调用工作正常。

现在我希望 WebService 作为特定的 SecurityRole 运行。

在 Web 服务中,我有以下注释:

@Stateless
@WebService
@DeclareRoles({ "LoggedUser" })
@SecurityDomain("my-jboss-real")
@RunAs("LoggedUser")
public class MyWebService { ...

现在我想从一个 Webservice 方法访问一个@EJBwith@RolesAllowed({"LoggedUser"})我得到:

ERROR [org.jboss.aspects.tx.TxPolicy] javax.ejb.EJBTransactionRolledbackException: javax.ejb.EJBAccessException.message: 'Caller unauthorized'
WARN  [org.jboss.ejb3.stateless.StatelessBeanContext] EJBTHREE-1337: do not get WebServiceContext property from stateless bean context, it should already have been injected
ERROR [org.jboss.ws.core.jaxws.SOAPFaultHelperJAXWS] SOAP request exception
javax.ejb.EJBTransactionRolledbackException: javax.ejb.EJBAccessException.message: 'Caller unauthorized'
        at org.jboss.ejb3.tx.Ejb3TxPolicy.handleInCallerTx(Ejb3TxPolicy.java:115)

我在 JBoss 5.1GA 上运行

这是正确使用@RunAs还是有其他方法可以做到这一点。

编辑

添加:

@Resource
private WebServiceContext wsCtx;
@Resource
private EJBContext ejbCtx;

myWebServiceMethod(){
     ...
     System.out.println("EJBCtx: " + ejbCtx.getCallerPrincipal());
     System.out.println("EJBCtx: " + ejbCtx.isCallerInRole("LoggedUser"));
     System.out.println("WebContext: " + wsCtx.getUserPrincipal());
     System.out.println("WebContext: " + wsCtx.isUserInRole("LoggedUser"));
     ...

这输出:

EJBCtx: anonymous
EJBCtx: false
WebContext: anonymous
WebContext: false
4

1 回答 1

4

JBoss AS 5 尤其是 6 在安全上下文和 @RunAs 方面非常有问题,除了最基本的用例。

AS 7 中已经修复了大量这些错误。您可以尝试在那里设置一个测试用例,看看是否遇到了同样的问题。

请意识到 @RunAs 不适用于在应用注释的 bean 中运行的代码。相反,它仅适用于从该 bean 调用的 bean。您可以将其视为“出站/出站”角色。

更麻烦的是,Java EE 有一个严重的遗漏,那就是无法同时定义一个 RunAs身份。当您为“未经身份验证”的身份定义 RunAs 角色时,某些服务器反应不佳。JBoss 具有用于 RunAs 标识的专有注释。如果这能让您更进一步,您可能想尝试一下。

于 2012-09-22T19:28:30.213 回答