2016-07-24 72 views
0

我有一個使用Spring MVC(RestControllers)和基於令牌的安全性(使用Spring Security)實現的REST服務。我如何根據用戶身份過濾資源?假設用戶有一些報告。我如何讓授權用戶通過撥打電話/報告只能看到他的報告?REST服務只返回當前用戶相關資源

很明顯,我可以讓userId成爲請求參數或路徑變量,但是有些東西告訴我這是一個不好的做法。

我假設我可以實現使用Spring Security功能,但我該如何做到這一點,更重要的是,在哪裏最適合應用此類過濾?控制器應該通過用戶身份執行對服務的調用,還是應該以某種方式在存儲庫級別檢索(我使用Spring Data JPA)? 在此先感謝

回答

0

你有Authentication對象每當用戶成功登錄。 它包含Object principalObject credentialsSet authorities

您只需要覆蓋UserDetailsService即可爲您的已驗證用戶添加新參數。在身份驗證添加您的userid shown in blog

現在,當你做

SecurityContextHolder.getContext()。getAuthentication()。getPrincipal() 這將返回彈簧安全的用戶對象。 您可以從這裏獲取用戶標識,並在控制器中使用它來執行必要的操作。

+0

您不需要會話,因爲已經提到安全性是由rest impl維護的,這只是一種將自定義數據添加到令牌的方法。 –

+0

謝謝!沒有更優雅的方式來獲取用戶信息嗎?使用Spring Security註釋之一可能?哪裏可以做到這一點?控制器? – underscore

+0

你也想看看[Json Web Tokens](https://jwt.io/)。是的,這是Spring Security根據文檔所做的。因爲SecurityContextHolder在上下文中是靜態的,所以你可以在控制器甚至服務中執行它。 –