簡體   English   中英

Jersey REST服務上的用戶身份驗證

[英]User authentication on a Jersey REST service

我正在開發一個使用Jersey框架的REST應用程序。 我想知道如何控制用戶身份驗證。 我搜索了很多地方,我發現的最接近的文章是: http//weblogs.java.net/blog/2008/03/07/authentication-jersey

但是,本文只能與GlassFish服務器和附加數據庫一起使用。 無論如何我可以在Jersey中實現一個接口並在到達請求的REST資源之前將其用作過濾器嗎?

我現在想要使用基本身份驗證,但它應該足夠靈活,以便我可以在以后更改它。

我成功地使用spring security來保護我的基於Jersey的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>)。 可以在此處找到security-applicationContext.xml的示例

我正在做類似的事情。 在我的實現中,我們使用Apache httpd前端來處理HTTP基本身份驗證,它只是使用包含用戶和角色的一些頭信息轉發所有請求。

從那時起,我正在使用servlet過濾器解析這些部分,使用我在CodeRanch上找到的帖子來包裝HttpServletRequest 這允許我在我想要過濾的每個資源上使用像@RolesAllowed這樣的javax.annotation.security注釋。 但是,要使所有這些部分都正常工作,我必須在web.xml中將以下內容添加到我的servlet中:

<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>

您可能會發現Eric Warriner對最近感興趣的帖子的回答: Jersey,Tomcat和Security Annotations

看看這里,我正在嘗試它,但看起來很有希望:

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

這個例子比嘗試實現JASPI / JASPIC簡單得多,並且為各個方法提供了更好的粒度(@ RolesAllowed,@ PermitAll,@ DenyAll等等)。

(我知道這是一個舊線程,但只是添加了可能有用的信息)

當然,您可以使用傳統的servlet過濾器。

將過濾器添加到web.xml,檢查您正在使用的任何身份驗證標頭(基本或摘要),根據這些值執行身份驗證邏輯,並將結果存儲在會話屬性中。 在您的Jersey資源(可能是ctor)中,從會話屬性中提取auth結果並繼續處理或不根據這是否是您需要的結果。

您的Jersey資源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
}

您可以通過兩種方式完成此操作:要么編寫簡單的servlet過濾器,要么必須實現ResourceFilterFactory並在ContainerRequestFilter中處理auth。 詳細代碼位於http://neopatel.blogspot.com/2011/11/jesey-writing-authentication-filter.html鏈接中。 我個人喜歡servlet過濾器方法,因為它提供了完整的生命周期控制。 但是,如果您需要更多特定的東西,比如訪問QueryParams或PathParams,那么ResourceFilterFactory就是您的選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM