我有一个匿名WebService EJB-Web服务调用工作正常。

现在,我希望WebService以特定的SecurityRole的身份运行。

在Webservice上,我有以下注释:

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

现在,我想从Webservice方法中使用@EJB访问@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

最佳答案

除了最基本的用例之外,JBoss AS 5(尤其是6)在安全上下文和@RunAs方面都存在很多错误。

这些错误中的许多已被修复
AS7。您可以尝试在此处设置测试用例,看看是否遇到相同的问题。

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

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

10-07 23:06