2010-05-25 68 views
39

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

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

我想現在使用基本認證,但它應該足夠靈活,以便我可以在以後更改。

回答

32

我成功使用spring security來保護我的基於Jersey的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的一個示例here

+0

摘錄您共享不再存在安全性的applicationContext.xml – Ishan 2016-04-09 09:38:21

+0

有這個答案的例子在這裏:HTTP:// stackoverflow.com/a/20882134/320791 – MauroPorrasP 2016-12-21 15:09:41

+0

我已經用包含示例security-applicationContext.xml – 2016-12-21 15:31:02

8

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

從那以後,我正在使用servlet filter來解析這些作品,並使用我在CodeRanch上找到的帖子來包裝HttpServletRequest。這使我可以在我想過濾的每個資源上使用​​註釋,如@RolesAllowed。要獲得所有這些作品不過工作的,我有以下添加到我的servlet在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> 

你可能會發現,埃裏克·沃里納對最近的文章中的利益答案: Jersey, Tomcat and Security Annotations

+0

的gist替換了死的片段,一旦您實現了自定義包裝和過濾器,如何連接它們以便它們被調用在資源請求? – Blaskovicz 2012-03-08 00:09:07

+0

你是如何設法做到這一點的?我正在尋找一種方法來做到這一點,也許你可以使用一些你使用的代碼? – Joelmob 2012-05-29 23:03:18

3

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

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

你的球衣資源的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

您可以通過兩種方式來完成它,要麼你寫一個簡單的Servlet過濾器,或者您必須實現ResourceFilterFactory並處理ContainerRequestFilter的權威性。詳細的代碼在鏈接http://neopatel.blogspot.com/2011/11/jesey-writing-authentication-filter.html。我個人喜歡servlet過濾器方法,因爲它提供了完整的生命週期控制。但是,如果您需要更多特定的東西,比如訪問QueryParams或PathParams,那麼ResourceFilterFactory就是要走的路。