Подтвердить что ты не робот

Аутентификация пользователя на службе Джерси REST

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

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

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

4b9b3361

Ответ 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 - это путь.