Да, это возможно. Джерси документация говорит:
Информация о безопасности запроса доступна при введении JAX-RS
Экземпляр SecurityContext с использованием аннотации @Context. Введенный
Экземпляр контекста безопасности обеспечивает эквивалент функциональности
доступно на HttpServletRequest API. Введенный контекст безопасности
зависит от фактического развертывания приложения в Джерси. Например, для
приложение Джерси, развернутое в контейнере сервлетов, Джерси
SecurityContext будет инкапсулировать информацию из контекста безопасности
извлекается из запроса сервлета. В случае заявления Джерси
развернутый на сервере Grizzly, SecurityContext вернет
информация, полученная из запроса Grizzly.
Пример:
@Path("basket")
public ShoppingBasketResource get(@Context SecurityContext sc) {
if (sc.isUserInRole("PreferredCustomer") {
return new PreferredCustomerShoppingBasketResource();
} else {
return new ShoppingBasketResource();
}
}
или
@Path("resource")
@Singleton
public static class MyResource {
// Jersey will inject proxy of Security Context
@Context
SecurityContext securityContext;
@GET
public String getUserPrincipal() {
return securityContext.getUserPrincipal().getName();
}
}
Или, если вы хотите обеспечить безопасность из коробки с аннотациями, отметьте эти документы .
Джерси также позволяет настроить SecurityContext:
SecurityContext может быть непосредственно получен из
ContainerRequestContext с помощью метода getSecurityContext (). Вы также можете
заменить SecurityContext по умолчанию в контексте запроса на пользовательский
один с использованием метода setSecurityContext (SecurityContext). Если вы установите
пользовательский экземпляр SecurityContext в вашем ContainerRequestFilter, это
Экземпляр контекста безопасности будет использоваться для внедрения в JAX-RS.
поля класса ресурсов. Таким образом, вы можете реализовать пользовательские
фильтр аутентификации, который может настроить ваш собственный SecurityContext, чтобы быть
используемый. Чтобы обеспечить раннее выполнение вашей пользовательской аутентификации
фильтр запроса, установите приоритет фильтра на AUTHENTICATION, используя
константы из приоритетов. Раннее выполнение вашей аутентификации
фильтр будет гарантировать, что все другие фильтры, ресурсы, методы ресурсов
и подресурсные локаторы будут выполняться с вашим заказом
Экземпляр SecurityContext.
См. примеры использования фильтров запросов с Джерси . И проверьте мой следующий пример:
import javax.annotation.Priority;
import javax.ws.rs.Priorities;
@Provider
@Priority(Priorities.AUTHENTICATION)
public class AuthRequestFilter implements ContainerRequestFilter {
@Context
HttpServletRequest webRequest;
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
final HttpSession session = webRequest.getSession();
requestContext.setSecurityContext(new SecurityContext() {
@Override
public Principal getUserPrincipal() {
return new PrincipalImpl((String)session.getAttribute("USER_NAME"));
}
@Override
public boolean isUserInRole(String s) {
return false;
}
@Override
public boolean isSecure() {
return false;
}
@Override
public String getAuthenticationScheme() {
return null;
}
});
}
}
Внимание! Это было введено в Джерси 2.4 .
Glassfish 4.0.0 использует старый Jersey 2.0, поэтому вам придется обновить Jersey с помощью этих советов (это не доказало свою эффективность). Или лучше скачать ночной сборки Glassfish 4.0.1 . но это не совсем стабильно в данный момент. Я надеюсь, что новая версия будет выпущена в ближайшее время.
UPDATE:
На данный момент (2014-02-14) ночная сборка Glassfish 4.0.1 использует Jersey 2.5.1, и отлично работает внедрение контекста.