2011-08-18 57 views
1

我有一個JEE6應用程序,駐留在Glassfish 3.1.1上,它通過一些REST資源向遠程客戶端提供服務。一些資源需要認證,其他資源則不需要。JEE6:自定義領域vs ResourceFilter - 哪一個更適合REST資源驗證?

目前我使用HTTP基本認證來保護安全資源,實現爲自定義領域/ LoginModule。如果身份驗證失敗,則登錄模塊會拋出一個LoginException Glassfish映射到HTTP 401.如果身份驗證成功,則資源可以訪問securityContext中的userPrincipal

雖然它的工作,它確實讓我煩惱,我不能攔截LoginException。我的客戶期望xml或json;在HTTP 401正文中,Glassfish爲它們提供了text/html。所有其他應用程序異常我都可以用ExceptionMapper進行截取,而不是LoginException。

目前我正在考慮用ResourceFilter替換自定義領域,我將手動進行HTTP基本身份驗證。我希望如果我在這裏拋出一個異常,它會被截取並正確映射/編組。

我的問題是:

  • 它是用於身份驗證的ResourceFilter一個好主意?性能如何?
  • 我該如何讓REST資源知道誰剛獲得身份驗證(誰是userPrinicipal)?
+0

順便說一句,我已經實現了它作爲一個ResourceFilter和一個Injectable UserProvider。如果有人有興趣,我很高興發佈代碼。不回答我的問題,如果它是一個好主意,但:) – Hank

回答

0

有點晚了,但無論如何...

其誰做身份驗證,因此它永遠不會到達你的資源的容器。就我個人而言,我喜歡容器管理的身份驗證方法,因爲它很好地將身份驗證與應用程序分開。

如果您想使用ResourceFilter,您可以從請求訪問SecurityContext。這包含校長。從那裏你可以填充例如一個可在整個應用程序中訪問的ApplicationConfig對象。

性能取決於認證實施。我想使用ResourceFilter時的開銷很小。如果需要,您可以始終使用會話Cookie來保持會話以防止再次進行身份驗證。

+0

我應該已經關閉了這個問題,因爲它不再是一個問題。我完全按照你用'ResourceFilter'和'SecurityContext'所說的做。在'ResourceFilter'中,我完全控制了異常btw .. – Hank

+0

感謝您的回覆:) – thehpi