Я запускаю Glassfish 4 и Jersey как исполнение JAX-RS. Я обеспеченный мое EJB так:Использование защищенного EJB с веб-службы JAX-RS
@Stateless
@DeclareRoles({"Authentication_Reader"})
@RolesAllowed({"Authentication_Reader"})
public class AuthenticationServiceBean {
public void foo() {
...
}
}
Я создал запись безопасности ролей отображения в GlassFish-web.xml, и я также создал декларацию безопасности роли в сети .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. Для меня это похоже на то, что все должно работать нормально.
РЕЗЮМЕ: Похоже, это невозможно. –