我正在运行Glassfish 4和Jersey作为JAX-RS实施。我已经确保了这样的EJB:

@Stateless
@DeclareRoles({"Authentication_Reader"})
@RolesAllowed({"Authentication_Reader"})
public class AuthenticationServiceBean { 
   public void foo() {
      ... 
   }

}

我已经在Glassfish-web.xml中创建了一个安全性映射条目,并且我还在web.xml中创建了一个Security-lole声明。

以下来自servlet的作品:

@WebServlet(name = "TestServlet", urlPatterns = {"/test.do"})
@RunAs("Authentication_Reader")
public class TestServlet extends HttpServlet {

    @Inject
    private AuthenticationServiceBean authenticationService;

    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       authenticationService.foo();
        .. etc ...
    }
}

但是,如果我从JAX-RS资源(这样的资源)做到这一点:

@RequestScoped
@RunAs("Authentication_Reader")
@Path("test")
public class TestResource {
    @Inject
    private AuthenticationServiceBean authenticationServiceBean;

    @GET
    public String test() {
        int x = 123;  // This code executes fine
        authenticationServiceBean.foo();   // This gets an AccessLocalException
        return "I never returned this";
    }
}

Glassfish服务器日志基本上说:Javax.ejb.AccessLocalexception:未授权此调用的客户端

我不明白为什么这适用于servlet,而不适合其余资源。对我来说,这似乎应该很好。

有帮助吗?

解决方案

如果您更改 TestResource 成为EJB,如果您注入 AuthenticationServiceBean 使用 @EJB 它应该起作用。

你可以看 泽西-ejb 例子。还有 泽西-GF-EJB 集成模块用于在玻璃鱼上使用EJB。这是 球衣 具体,JAX-RS不支持将EJB注入资源类。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top