2009-11-05 55 views
2

我試圖找到一種簡單靈活的方法將JaaS身份驗證添加到REST。我發現了一個post,我認爲它帶領我走向正確的方向(請參閱StevenC的回答)。聽起來像servlet容器負責安全性,而不是Jersey代碼本身。我喜歡這個想法,但需要一些實施指導。在澤西灰熊上使用JaaS

Grizzly是我的servlet容器,我想將其配置爲使用JaaS進行身份驗證。現在,一個簡單的用戶名/密碼組合就可以,並且直接在代碼中直接對用戶名/密碼對進行硬編碼是沒有問題的。只要它使用JaaS,我們可以稍後改進這些細節。至於通過HTTP發送的內容,我認爲存儲cookie是實現這一切的最簡單方法。無論如何都要將身份驗證垃圾從我的Jersey代碼中刪除。

下面的代碼到目前爲止開始灰熊:


final String baseUri = "http://localhost:9998/"; 
final Map initParams = new HashMap(); 

initParams.put("com.sun.jersey.config.property.packages", 
    "my.jersey.Service"); 

System.out.println("Starting grizzly..."); 
SelectorThread threadSelector = GrizzlyWebContainerFactory.create(baseUri, initParams); 
System.out.println(String.format(
     "Jersey app started with WADL available at %sapplication.wadl\n" 
    + "Try out %shelloworld\nHit enter to stop it...", baseUri, baseUri));     
System.in.read(); 
threadSelector.stopEndpoint(); 
System.exit(0); 

如果這整個過程中的工作,有什麼檢查權限用戶的最佳方法是什麼?我可能會希望我的REST代碼在某些地方實際驗證權限。我是否在正確的軌道上?有更容易的方法嗎?鏈接到教程將是一個很好的答案。即使像「我做到了這一點,它的工作原理」這樣的答案,也會給我一個溫暖的模糊,我正朝着正確的方向前進。

感謝您的任何幫助。

編輯:一些澄清的StevenC的評論:

  • 你仍想使用Servlet過濾器來保護您的資源?我將使用任何可以從Jersey代碼中分離出認證細節的東西。它不一定是servlet過濾器。
  • 「配置爲使用JaaS」是什麼意思?最初的計劃是使用JaaS來保護當前的API。下一階段將使整個API在線提供。圍繞API調用使用Jersey包裝器似乎很有意義,但保持由Grizzly處理的認證。在我相信的時候,灰熊將不得不與JaaS互動。
  • 您是否認爲應該有一些簡單的配置才能保護您的資源?我正在考慮對用戶進行身份驗證以及基於角色授權用戶訪問資源的兩個步驟。這個想法是讓Grizzly處理認證(使用JaaS)和Jersey處理授權。
  • 「我不認爲需要使用帶有RESTful資源的Cookie。」刪除cookies的使用會很棒,但是如何完成?系統需要知道用戶是否被認證。我寧願不要求他們通過每個電話的用戶名/密碼/等。甚至在每次調用時將會話標記作爲參數傳遞都顯得很「醜陋」。

此外,請注意,我是REST的新手。我一直在做SOAP幾年,所以我可能會有一種「SOAP偏見」,可能會讓我不知道每個人都使用的簡單明瞭的解決方案。如果有更簡單的方法,請隨時分享。我只是儘量學習。

+0

我也許應該張貼我的答案之前評論,但是這個問題需要一點澄清: - 你仍然想使用Servlet過濾器來保護您的資源? - 「配置爲使用JaaS」意味着什麼?你是否認爲應該有一些簡單的配置讓灰熊保護你的資源? - JaaS本身只是一個框架,你必須插入一些認證「領域」或來源(用LoginModule實現)。 - 我沒有看到使用RESTful資源的cookie的必要性(假設這是你想使用球衣的)。 – StevenC 2009-11-09 01:10:06

+0

@ User1,你有沒有經歷過這個項目?我一整天都在撕掉我的頭髮,以獲得HTTP身份驗證工作。 (剛剛發佈了一個[類似問題](http://stackoverflow.com/questions/14608162/basic-http-authentication-with-jersey-grizzly)今天早些時候。) – aioobe 2013-01-30 19:55:04

+0

我不認爲我得到它的工作。抱歉。我一直在用駱駝做Jetty。這是一個完全不同的範例,但對我的情況更好。作爲提示,我避免了HTTP身份驗證,並使用會話。用戶必須以某種形式登錄,然後將該會話授予適當的頁面。此設計適用於執行會話的任何HTTP服務器。 – User1 2013-01-30 21:25:50

回答

1

不知道你是否在問如何保護每個資源,但我發現javapassion上的演示文稿聽起來像你在找什麼。他說使用@Context SecurityContext作爲參數。

@Path("basket") 
    // Sub-resource locator could return a different resource if a user 
    // is a preferred customer: 
    public ShoppingBasketResource get(@Context SecurityContext sc) { 
    if (sc.isUserInRole("PreferredCustomer") { 
     return new PreferredCustomerShoppingBaskestResource(); 
    } else { 
     return new ShoppingBasketResource(); 
    } 
} 
+0

如果認證是由容器(例如Tomcat)執行的,甚至在JAX-RS過濾/調度之前進行認證 – yegor256 2010-12-12 14:12:52

3

我不完全清楚「配置它使用JaaS進行身份驗證」是什麼意思。如果有一個簡單的配置讓grizzly執行HTTP身份驗證保護URL,我不知道它。

我假設從其他問題和答覆你引用,你想使用一個servlet過濾器。通常這是在servlet項目的web.xml文件中配置的。當然,Grizzly通常用於從代碼啓動服務器,而不是應用程序配置。當我以這種方式使用grizzly時,我注意到GrizzlyWebContainerFactory沒有提供允許您指定servlet過濾器的任何版本的create()。不過,我確實注意到ServletAdapter [1]在提供該功能的同一個項目中。

至於過濾器本身,我不知道預構建的servlet過濾器只是簡單地將JaaS配置的登錄模塊插入到您的應用程序中,因此您可能必須在其中寫入一些代碼。不過,只需選擇基於HTTP的身份驗證方法(例如,HTTP BASIC,DIGEST等),相應地從請求中提取證書,然後使用JaaS框架進行登錄。我沒有看到RESTful資源特別需要cookie。 REST風格的建築風格在保持會話時會皺眉。否則,有很多關於JaaS的教程,所以在這裏我不會詳細說明。

一旦JaaS主題處於活動狀態(使用者成功登錄),您可以簡單地獲取當前主題並使用Subject.getSubject方法檢查活動主體和憑證。

無論如何,這個答案是專門給出更多關於使用servlet過濾器進行身份驗證的細節,正如您在其他(鏈接)問題中所要求的。這不一定是在澤西網絡應用程序中進行身份驗證的唯一方式,但這是一種相當直接的方式。我喜歡它,因爲它阻止我在需要它的每個資源中注入重複的授權代碼。

[1] https://grizzly.dev.java.net/nonav/apidocs/com/sun/grizzly/http/servlet/ServletAdapter.html