簡體   English   中英

jax-rs rest webservice身份驗證和授權

[英]jax-rs rest webservice authentication and authorization

我有一個Web應用程序,需要允許用戶使用不同的webclients(瀏覽器,本機移動應用程序等)進行注冊。 登錄后,他們可以訪問受限制的內容或他們自己的內容(如他們創建的條目等)。

到目前為止我做了什么:我創建了一個jax-rs rest webservice(我在glassfish上托管我的應用程序),它暴露了以下方法:

  • 注冊 - 用戶POST是他想要的用戶名/密碼/電子郵件/等; 如果用戶名/電子郵件是唯一的,則在數據庫中創建該用戶的條目(我使用Hibernate進行持久化)
  • login - 用戶POST的用戶名和密碼。 如果它們沒問題,則創建UUID並將其返回給用戶(這將用作將來請求的令牌)。 我有一個名為logedusers的表,其中包含userID,token,validSince作為列。

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

假設我有另一個方法getUserEntries,它應返回用戶所做的所有條目。 為了更清楚,將有一個包含以下字段的Entry表:entryId,userId,text。

這里最好的方法是什么?

我現在做的是,我發出一個get請求並傳入令牌,如下所示:

localhost:8080/myApp/getUserEntries?token=erf34c34

之后,如果令牌有效,我從logedusers表中獲取userID並基於該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天等)。

謝謝

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

這有點好。 概念級別也不算太糟糕(假設您完全可以進行自我注冊),但界面需要進行大量調整。 雖然是,POST注冊和登錄是正確的,對於您的webapp的其余部分,您應該在需要時從上下文中提取身份信息,並在方法級別使用基於角色的訪問控制。

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

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

他們需要身份嗎? 或者他們只是需要知道允許用戶訪問它們? 如果是后者,最簡單的方法是在方法上放置一個合適的@RolesAllowed注釋,此時(具有合適的配置;請參閱JEE5安全文檔 )。 如果是前者,則需要為當前操作獲取HttpServletRequest對象並調用其getUserPrincipal()方法以獲取用戶的身份(如果尚未登錄,則為null)。 這個SO問題描述了如何獲取請求對象; 有幾種可能的方法,但我建議通過@Resource注釋注入。

我不會做的是允許用戶通常通過@QueryParam提供自己的身份; 這只是非常容易被濫用。 您可以允許他們以這種方式詢問其他用戶 ,但是您需要根據當前用戶是否被允許了解其他用戶的任何內容來決定是否要告訴他們。 這是真正的應用程序中出現的那種復雜的安全問題,並且是需要當前經過驗證的用戶身份的好點。

暫無
暫無

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

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