3 回答

TA貢獻1842條經驗 獲得超21個贊
雖然Ralphs Answer提供了一個優雅的解決方案,但使用Spring Security 3.2,您不再需要實現自己的解決方案ArgumentResolver
。
如果您有UserDetails
實現CustomUser
,您可以這樣做:
@RequestMapping("/messages/inbox")public ModelAndView findMessagesForUser(@AuthenticationPrincipal CustomUser customUser) { // .. find messages for this User and return them...}
請參閱Spring Security Documentation:@AuthenticationPrincipal

TA貢獻1856條經驗 獲得超11個贊
Spring Security旨在與其他非Spring框架一起使用,因此它沒有與Spring MVC緊密集成。默認情況下,Spring Security會Authentication
從HttpServletRequest.getUserPrincipal()
方法返回對象,因此您將獲得作為主體的內容。您可以UserDetails
使用以下方法直接從中獲取對象
UserDetails ud = ((Authentication)principal).getPrincipal()
另請注意,對象類型可能會有所不同,具體取決于所使用的身份驗證機制(UsernamePasswordAuthenticationToken
例如,您可能不會獲得),并且Authentication
嚴格來說不必包含a UserDetails
。它可以是字符串或任何其他類型。
如果您不想SecurityContextHolder
直接調用,最優雅的方法(我將遵循)是注入您自己的自定義安全上下文訪問器接口,該接口是自定義的,以匹配您的需求和用戶對象類型。使用相關方法創建接口,例如:
interface MySecurityAccessor { MyUserDetails getCurrentUser(); // Other methods}
然后,您可以通過訪問SecurityContextHolder
標準實現來實現此功能,從而完全將您的代碼與Spring Security分離。然后將其注入需要訪問當前用戶的安全信息或信息的控制器。
另一個主要好處是很容易使用固定數據進行簡單的實現測試,而不必擔心填充線程本地等等。
添加回答
舉報