Использование защищенного EJB из веб-службы JAX-RS

Я использую Glassfish 4 и Jersey в качестве реализации JAX-RS. Я защитил свой EJB следующим образом:

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

}

Я создал запись сопоставления ролей безопасности в файле glassfish-web.xml, а также объявление роли безопасности в файле web.xml.

Следующее работает из сервлета:

@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: клиент не авторизован для этого вызова

Я не понимаю, почему это работает для сервлета, а не для ресурса REST. Мне кажется, что это должно работать нормально.


person Torbjørn Kristoffersen    schedule 08.11.2013    source источник
comment
РЕЗЮМЕ: Кажется, что это невозможно сделать.   -  person Torbjørn Kristoffersen    schedule 08.11.2013


Ответы (1)


Если вы измените TestResource на EJB и если вы введете AuthenticationServiceBean с помощью @EJB, это должно сработать.

Вы можете посмотреть пример jersey-ejb. А также есть jersey-gf-ejb модуль интеграции, который будет использоваться для использования EJB на Glassfish AS. Это специфично для Jersey, JAX-RS пока не поддерживает внедрение EJB в класс Resource.

person shamoh    schedule 17.12.2014