@RunAs用于@WebService EJB

时间:2012-09-13 07:21:42

标签: java web-services security ejb

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

现在我想将WebService作为特定的SecurityRole运行。

在Webservice,我有以下注释:

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

现在,我想从Web服务方法访问带有@EJB的{​​{1}}:

@RolesAllowed({"LoggedUser"})

我正在运行JBoss 5.1GA

这是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) 的正确用法,还是有另一种方法可以做到这一点。

修改

添加了:

@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"));
     ...

1 个答案:

答案 0 :(得分:4)

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

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

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

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