java - @RunAs 用于@WebService EJB

标签 java web-services security ejb

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

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

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

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

现在我想使用 @RolesAllowed({"LoggedUser"}) 从 Webservice 方法访问 @EJB 我得到:

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 方面存在很多问题,但最基本的用例除外。

其中的大量错误已在 AS 7。你可以尝试在那里设置一个测试用例,看看你是否遇到同样的问题。

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

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

关于java - @RunAs 用于@WebService EJB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12401329/

相关文章:

java - Java EE 服务器上的动态角色

java - 实现服务器和客户端

security - 如何保护网络服务器的图像上传目录?

java - 为什么我不能在从数据库中获取的对象中使用持久化?

java - 如何将通用对象发布到 Spring Controller ?

java - 构造函数参数 "this"从 Activity 但从 Fragment 工作

c# - 浏览器可以访问 web 服务,但我的 C# 应用程序获取 "Could not establish trust relationship"

ios - 推荐 : RestKit or AFNetworking for Rest/Soap server

security - 基于 CGI 的 Web 应用程序的安全性如何?

javascript - Node js 请求获取 ETIMEDOUT 'ip address'