2016-10-29 56 views
0

我有Spring REST後端和Angular前端。如何在客戶端進行REST驗證後獲取用戶信息?

身份驗證是使用POST請求在請求JSON正文(我使用基於表單的身份驗證)內使用帶有用戶名和密碼的「/ login」URL執行的。 REST後端以OK代碼回覆。一切都很好,我可以從前端執行需要驗證的其他請求。

但前端需要知道經過身份驗證的用戶的角色,以便它可以顯示適當的視圖/死機。我們在哪裏可以在前端獲得這個角色?我們從身份驗證中得到的唯一回應是OK,對於REST來說很好。

我們可以通過對「/ users/[user_id]」執行GET請求來獲取用戶信息。但是我們沒有用戶名,只有用戶名。

所以問題是 - 什麼是REST從只有用戶名的前端獲取角色(或其他用戶信息)的正確方法?

作爲一種解決方法,我可以在後端使用用戶名而不是id創建新請求,或者我可以將用戶標識添加到認證響應。但我不確定從REST的角度來看這是一種正確的方式。

+0

如果您的後端需要傳遞用戶標識以獲取當前用戶信息,但不允許獲取用戶標識,那麼後端具有嚴重的設計問題。您似乎可以發送需要驗證的請求。這意味着後端能夠識別你是誰(可能要歸功於cookie)。如果這是真的,你不需要傳遞任何東西作爲參數,因爲它隱式地傳遞到cookie中。您可以擁有/當前用戶資源。 –

+0

後端和前端都由我開發。後端在REST之後提供用戶信息的正確方法是什麼? –

+0

我剛剛告訴過你。假設後端有一個確定請求的隱式方式(例如使用cookie),您可以提供/ current-user或/我或任何想要命名它的資源。例如,請參閱https://developer.github.com/v3/users/#get-the-authenticated-user。 –

回答

0

在討論了@JBNizet在註釋中的問題後,我決定將REST端點從「/ users /:user_id」更改爲「/ users /:user_name」。

0

您無法重寫HTTP方法。因此,如果您打算使用具有相同路徑的不同查詢參數來編寫GET調用,則不允許。您需要編寫兩個GET路徑。

例如

GET /用戶/用戶名/ {ID} GET /用戶/用戶名/ {name}的

而在第二個電話,您可以添加所需的邏輯在第二個獲得角色。

+0

但是從REST的角度來看,我不確定這是否正確。 「DELETE/users/username」是什麼意思? –

+0

如果您不想允許DELETE,那麼不要爲DELETE調用編寫實現。根據REST標準,這是完全可以接受的。 – Sakalya

0

有兩種做法。

1)從服務器認證成功後,做一個更$http電話與用戶名的服務器,從中可以獲取來自獲取服務器的邏輯和商店,導致$rootScope。這個信息的詳細內容將可通過出應用程序。

2)在對用戶進行身份驗證時,如果用戶有效,則獲取他的詳細信息並將其存儲在對象中。

現在,在您的服務器邏輯,而返回的響應,你可以做類似下面

response.setHeaders("User",userDetilsObj); 

注意:響應是一個HttpServletResponse對象。

正如你所說,我們會得到一個狀態OK響應爲200接入的JS端的用戶信息按照下面的代碼

if(response.status == '200/OK'){ 
    $rootScope.user = response.getHeaders().User;//In this object all the user details set at server side are available now.. 
} 

希望這給你如何一些光請求完成後實現你想要的結果。

+0

謝謝。這兩種方式看起來與我在問題中提到的解決方法非常相似。而問題是關於另一件事。 JB Nizet指出,從設計的角度來看,用「/ users /:name」端點替換「/ users /:id」是可以的,以便回答我的問題。 –

+0

是肯定的,但你已經問過哪種方法是更好的方法,所以我建議去第一種清潔和可維護的方法。 –

+0

使用「/ users /:name」並不是一種更簡潔的方法,因爲ID是永遠保持不變的名稱,可以更改名稱,也可以區分大小寫,並且需要進行轉換如果有更多的用戶具有相同的名稱,該怎麼辦?你將如何決定哪一個已經登錄? –

0

在您對用戶進行身份驗證時從服務器獲取用戶信息。通過成功用戶身份驗證的用戶詳細信息。