Ich bin Glassfish 4 und Jersey als JAX-RS-Implementierung. Ich habe mein EJB so gesichert:
@Stateless
@DeclareRoles({"Authentication_Reader"})
@RolesAllowed({"Authentication_Reader"})
public class AuthenticationServiceBean {
public void foo() {
...
}
}
Ich habe einen Sicherheitsrollen-Mapping-Eintrag in Glassfish-Web.xml erstellt und auch eine Sicherheitsrollenerklärung in web.xml erstellt.
Die folgenden Arbeiten von einem 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 ...
}
}
Aber wenn ich es aus einer JAX-RS-Ressource wie dieses mache:
@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";
}
}
Das Glassfish Server -Protokoll sagt im Grunde: javax.ejb.accessLocalException: Client nicht für diesen Aufruf autorisiert
Ich verstehe nicht, warum dies für ein Servlet und nicht für die Restressource funktioniert. Für mich scheint dies gut zu funktionieren.