Я использую WildFly 16 и провожу эксперимент с API безопасности EE 8. У меня есть конечная точка JAX-RS, подобная этой (с некоторым определением в web.xml, jboss-web.xml):
@Path("/secured")
public class SecuredResource {
@Inject
private SecurityContext securityContext;
@GET
@Path("/greet")
@RolesAllowed({"USER"})
@Produces(MediaType.TEXT_PLAIN)
public Response greet() {
return Response.ok().entity("Hello " + securityContext.getCallerPrincipal().getName()).build();
}
}
Как я и ожидал, запросы, у которых нет роли «USER», не достигают там кода, но эти запросы получают http-ответы с кодом 200. Я хочу вернуть «401 Unauthorized» для этих запросов, а не 200 .
Согласно документу RESTEasy , он должен вести себя так:
Как Resteasy выполняет авторизацию? Ну, это действительно просто. Он просто видит, аннотирован ли метод с помощью @RolesAllowed, а затем просто выполняет HttpServletRequest.isUserInRole. Если один из @RolesAllowed пройдет, то разрешите запрос, в противном случае ответ будет отправлен обратно с кодом ответа 401 (неавторизованным).
Но в моем случае это не так. Как я могу заставить это работать таким образом?
Это весь проект моей экспериментальной реализации . У него также есть тестовый пример, который показывает мои ожидания . Может работать с ./mvnw clean verify