3 回答
TA貢獻1842條經(jīng)驗 獲得超22個贊
雖然Ralphs Answer提供了一個優(yōu)雅的解決方案,但使用Spring Security 3.2,您不再需要實現(xiàn)自己的解決方案ArgumentResolver。
如果您有UserDetails實現(xiàn)CustomUser,您可以這樣做:
@RequestMapping("/messages/inbox")public ModelAndView findMessagesForUser(@AuthenticationPrincipal CustomUser customUser) {
// .. find messages for this User and return them...}請參閱Spring Security Documentation:@AuthenticationPrincipal
TA貢獻1856條經(jīng)驗 獲得超11個贊
Spring Security旨在與其他非Spring框架一起使用,因此它沒有與Spring MVC緊密集成。默認情況下,Spring Security會Authentication從HttpServletRequest.getUserPrincipal()方法返回對象,因此您將獲得作為主體的內(nèi)容。您可以UserDetails使用以下方法直接從中獲取對象
UserDetails ud = ((Authentication)principal).getPrincipal()
另請注意,對象類型可能會有所不同,具體取決于所使用的身份驗證機制(UsernamePasswordAuthenticationToken例如,您可能不會獲得),并且Authentication嚴格來說不必包含a UserDetails。它可以是字符串或任何其他類型。
如果您不想SecurityContextHolder直接調(diào)用,最優(yōu)雅的方法(我將遵循)是注入您自己的自定義安全上下文訪問器接口,該接口是自定義的,以匹配您的需求和用戶對象類型。使用相關(guān)方法創(chuàng)建接口,例如:
interface MySecurityAccessor {
MyUserDetails getCurrentUser();
// Other methods}然后,您可以通過訪問SecurityContextHolder標準實現(xiàn)來實現(xiàn)此功能,從而完全將您的代碼與Spring Security分離。然后將其注入需要訪問當前用戶的安全信息或信息的控制器。
另一個主要好處是很容易使用固定數(shù)據(jù)進行簡單的實現(xiàn)測試,而不必擔心填充線程本地等等。
添加回答
舉報
