Аутентификация пользователя на службе Джерси REST
Я разрабатываю приложение REST, которое использует фреймворк Джерси. Я хотел бы знать, как я могу контролировать аутентификацию пользователя. Я искал много мест, и ближайшая статья, которую я нашел, такова: http://weblogs.java.net/blog/2008/03/07/authentication-jersey.
Однако эту статью можно использовать только с сервером GlassFish и с подключенной базой данных. Есть ли в любом случае, что я могу реализовать интерфейс в Джерси и использовать его в качестве фильтра до достижения запрошенного ресурса REST?
Я хочу использовать базовую проверку подлинности прямо сейчас, но она должна быть достаточно гибкой, чтобы я мог изменить ее позже.
Ответы
Ответ 1
Я успешно использую spring безопасность для защиты моего API на основе Джерси. Он имеет подключаемые схемы аутентификации, позволяющие вам перейти от Basic Auth к чему-то еще позже. Я вообще не использую spring, просто материал безопасности.
Вот соответствующая часть из моего web.xml
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/security-applicationContext.xml,
/WEB-INF/applicationContext.xml
</param-value>
</context-param>
<!-- Enables Spring Security -->
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>
org.springframework.web.filter.DelegatingFilterProxy
</filter-class>
<init-param>
<param-name>targetBeanName</param-name>
<param-value>springSecurityFilterChain</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Вы можете оставить applicationContext.xml пустым (<beans> </beans & gt;). Пример security-applicationContext.xml можно найти здесь
Ответ 2
Я работаю над чем-то похожим на это. В моей реализации у нас есть Apache httpd front-end для обработки аутентификации HTTP Basic, и он просто пересылает все запросы с некоторой информацией заголовка, содержащей пользователя и роли.
От этого я работаю над разбором этих фрагментов, используя фильтр сервлетов, чтобы обернуть HttpServletRequest
, используя сообщение, которое я нашел на CodeRanch. Это позволяет мне использовать аннотации javax.annotation.security
типа @RolesAllowed
для каждого ресурса, который я хочу фильтровать. Однако, чтобы получить все эти части, мне пришлось добавить в свой сервлет в web.xml
:
следующее:
<servlet>
<!-- some other settings and such
... -->
<init-param>
<param-name>com.sun.jersey.spi.container.ResourceFilters</param-name>
<param-value>com.sun.jersey.api.container.filter.RolesAllowedResourceFilterFactory</param-value>
</init-param>
...
</servlet>
Вы можете обнаружить, что Эрик Уорринер отвечает на недавнее сообщение, представляющее интерес:
Джерси, Tomcat и аннотации безопасности
Ответ 3
Посмотрите здесь, я нахожусь в середине попытки, но выглядит многообещающе:
http://anismiles.wordpress.com/2012/03/02/securing-versioning-and-auditing-rest-jax-rs-jersey-apis/
Этот пример намного проще, чем попытка реализовать JASPI/JASPIC и обеспечивает лучшую детализацию для отдельных методов (@RolesAllowed, @PermitAll, @DenyAll и т.д.).
(Я знаю, что это старый поток, но просто добавление потенциально полезной информации)
Ответ 4
Конечно, для этого можно использовать традиционный фильтр сервлета.
Добавьте фильтр в свой web.xml, проверьте, какие заголовки для проверки подлинности вы используете (Basic или Digest), выполните свою логику аутентификации на основе этих значений и сохраните результат в атрибуте сеанса. В ресурсе "Джерси" (возможно, ctor) выведите результат аутентификации из атрибута сеанса и продолжите обработку или нет, основываясь на том, нужен ли вам результат.
Ваш ресурс ресурса в Джерси, вероятно, будет выглядеть следующим образом:
protected AbstractResource(@Context ServletContext servletContext,
@Context HttpServletRequest httpServletRequest) {
...
HttpSession session = httpServletRequest.getSession();
// get whatever you put in the session in the auth filter here and compare
}
Ответ 5
Вы можете сделать это двумя способами: либо напишите простой фильтр сервлетов, либо вам необходимо реализовать ResourceFilterFactory и обработать auth в ContainerRequestFilter. Детальный код находится в ссылке http://neopatel.blogspot.com/2011/11/jesey-writing-authentication-filter.html. Мне нравится подход фильтра сервлетов лично, поскольку он дает полный контроль жизненного цикла. Однако, если вам нужны более конкретные вещи, такие как доступ к QueryParams или PathParams, тогда ResourceFilterFactory - это путь.