3 回答

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