2012-01-15 44 views
7

我有一個web應用程序需要允許使用不同web客戶端(瀏覽器,原生移動應用程序等)的用戶進行註冊。登錄後,他們可以訪問受限制的內容或他們自己的內容(如他們創建的條目等)。jax-rs其餘web服務認證和授權

我做了什麼至今:我創建了一個JAX-RS休息web服務(我主持我的GlassFish應用),其公開下列方法:

  • 寄存器 - 用戶POST的他所期望的用戶名/密碼/電子郵件/等;如果用戶名/電子郵件是唯一的,則在數據庫中創建此用戶的條目(我正在使用Hibernate進行持久化)
  • login - 用戶POST的用戶名和密碼。如果它們沒問題,則創建UUID並將其返回給用戶(這將用作未來請求的標記)。我有一個名爲logedusers的表,帶有userID,token,validSince作爲列。

這裏是讓我感到困惑的地方。

比方說,我有另一種方法,getUserEntries,應該返回用戶所做的所有條目。爲了使這一點更清楚,將會有一個Entry表格,其中包含以下字段:entryId,userId,text。

這裏最好的辦法是什麼?

我現在所做的工作,是我做一個GET請求,並在令牌這樣傳遞:

localhost:8080/myApp/getUserEntries?token=erf34c34

之後,如果令牌是有效的,我從logedusers表以及基於用戶ID在該userId上,獲取所有條目並將它們返回爲json。

事情是這樣的:

@GET 
@Path("getUserEntries") 
@Produces(MediaType.APPLICATION_JSON) 
public Response getUserEntries(@QueryParam("token") String token) {  
    String userId=getUserIdFromToken(token); 
    if (userId == null){ 
     return Response.status(Response.Status.UNAUTHORIZED).build(); 
    } else { 
     //get some data associated with that userId, put it in the response object and send it back 
     return Response.ok().entity(response).build(); 
    } 
} 

但是,如果我有更多的方法提供的數據,如果他們是通過一個有效的用戶調用會發生什麼?

我不得不在每個方法的開始都做這個檢查。

我想使這個授權過程透明

所以,兩個主要的問題在這裏:

  1. 這是設計好的?整個用戶/通過身份驗證,服務器創建並存儲令牌給用戶,用戶在將來的請求中發送令牌。
  2. 如果我有許多終端需要確定主叫用戶的身份,該怎麼辦?我可以使用某些註釋標記它們,使用某種安全提供程序/身份驗證程序(我可以在其中添加自己的邏輯以進行驗證 - 例如,檢查標記是否不超過5天等)。

感謝

回答

2

這是設計好的?整個用戶/通過身份驗證,服務器創建並存儲令牌給用戶,用戶在將來的請求中發送令牌。

它有點不錯。概念級別不算太差(假設你完全可以自行註冊),但界面需要大量調整。雖然是的,但是註冊和登錄的POST是正確的,對於其他Web應用程序,如果您需要,您應該將身份信息從上下文中提取出來,並在您可以的方法級別使用基於角色的訪問控制。

請注意,您的容器有一整套內置的身份驗證和授權支持機制。請使用它們。

如果我有很多終端需要確定主叫用戶的身份,該怎麼辦?我可以使用某些註釋標記它們,使用某種安全提供程序/身份驗證程序(我可以在其中添加自己的邏輯以進行驗證 - 例如,檢查標記是否不超過5天等)。

他們需要身份?或者他們只需要知道用戶被允許訪問它們?如果是後者,最簡單的方法是在該方法上放置一個合適的@RolesAllowed註釋,此時(具有合適的配置;請參閱JEE5 security docs)。如果是前者,則需要獲取當前操作的HttpServletRequest對象,並調用其getUserPrincipal()方法來獲取用戶的身份(如果尚未登錄,則爲null)。 This SO question描述如何去獲取請求對象;有幾種可能的方式來做到這一點,但我建議通過@Resource註釋注射。

我不會做的是允許用戶通常通過@QueryParam提供自己的身份;這只是開放濫用。您可以允許他們以這種方式詢問其他用戶,但是您需要根據是否允許當前用戶瞭解其他用戶的任何信息來決定是否要告訴他們任何事情。這是真實應用程序中出現的那種複雜的安全問題,對於需要當前驗證的用戶身份來說是一個很好的選擇。