Аутентификация пользователя в сервисе REST Джерси - PullRequest
39 голосов
/ 25 мая 2010

Я занимаюсь разработкой приложения REST, в котором используется среда Джерси. Я хотел бы знать, как я могу контролировать аутентификацию пользователей. Я искал много мест, и самая близкая статья, которую я нашел, является этим: http://weblogs.java.net/blog/2008/03/07/authentication-jersey.

Однако эту статью можно использовать только с сервером GlassFish и присоединенной базой данных. В любом случае можно ли реализовать интерфейс на Джерси и использовать его в качестве фильтра до достижения запрошенного ресурса REST?

Я хочу использовать базовую аутентификацию прямо сейчас, но она должна быть достаточно гибкой, чтобы я мог изменить это позже.

Ответы [ 5 ]

32 голосов
/ 25 мая 2010

Я успешно использую Spring Security для защиты моего API на основе Джерси. Он имеет подключаемые схемы аутентификации, позволяющие переключаться с обычной аутентификации на другую позже. Я вообще не пользуюсь 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 пустым (). Пример файла security-applicationContext.xml можно найти здесь

8 голосов
/ 27 мая 2010

Я работаю над чем-то похожим на это. В моей реализации у нас есть внешний интерфейс Apache httpd для обработки аутентификации 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 и аннотации безопасности

4 голосов
/ 20 апреля 2013

Посмотрите здесь, я сейчас пытаюсь, но выглядит многообещающе:

http://anismiles.wordpress.com/2012/03/02/securing-versioning-and-auditing-rest-jax-rs-jersey-apis/

Этот пример намного проще, чем попытка реализовать JASPI / JASPIC, и обеспечивает лучшую детализацию для отдельных методов (@RolesAllowed, @PermitAll, @DenyAll и т. Д. ...).

(я знаю, что это старая ветка, но я просто добавляю потенциально полезную информацию)

3 голосов
/ 11 сентября 2010

Конечно, вы можете использовать для этого традиционный фильтр сервлетов.

Добавьте фильтр в ваш 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
}
2 голосов
/ 05 ноября 2011

Вы можете сделать это двумя способами: либо вы пишете простой фильтр сервлета, либо вам нужно реализовать ResourceFilterFactory и обработать аутентификацию в ContainerRequestFilter. Подробный код находится по ссылке http://neopatel.blogspot.com/2011/11/jesey-writing-authentication-filter.html.. Мне лично нравится подход фильтра сервлетов, поскольку он дает полный контроль над жизненным циклом. Однако, если вам нужны более конкретные вещи, такие как доступ к QueryParams или PathParams, тогда ResourceFilterFactory - это то, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...