亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何獲取活動用戶的UserDetails

如何獲取活動用戶的UserDetails

肥皂起泡泡 2019-07-25 15:54:45
如何獲取活動用戶的UserDetails在我的控制器中,當我需要活動(登錄)用戶時,我正在執行以下操作來獲取我的UserDetails實現:User activeUser = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();log.debug(activeUser.getSomeCustomField());它工作正常,但我認為Spring可以在這樣的情況下讓生活更輕松。有沒有辦法將UserDetails自動裝配到控制器或方法?例如,類似于:public ModelAndView someRequestHandler(Principal principal) { ... }但是,而不是得到UsernamePasswordAuthenticationToken,我得到了一個UserDetails?我正在尋找一個優雅的解決方案。有任何想法嗎?
查看完整描述

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


查看完整回答
反對 回復 2019-07-25
?
呼喚遠方

TA貢獻1856條經驗 獲得超11個贊

Spring Security旨在與其他非Spring框架一起使用,因此它沒有與Spring MVC緊密集成。默認情況下,Spring Security會AuthenticationHttpServletRequest.getUserPrincipal()方法返回對象,因此您將獲得作為主體的內容。您可以UserDetails使用以下方法直接從中獲取對象

UserDetails ud = ((Authentication)principal).getPrincipal()

另請注意,對象類型可能會有所不同,具體取決于所使用的身份驗證機制(UsernamePasswordAuthenticationToken例如,您可能不會獲得),并且Authentication嚴格來說不必包含a UserDetails。它可以是字符串或任何其他類型。

如果您不想SecurityContextHolder直接調用,最優雅的方法(我將遵循)是注入您自己的自定義安全上下文訪問器接口,該接口是自定義的,以匹配您的需求和用戶對象類型。使用相關方法創建接口,例如:

interface MySecurityAccessor {

    MyUserDetails getCurrentUser();

    // Other methods}

然后,您可以通過訪問SecurityContextHolder標準實現來實現此功能,從而完全將您的代碼與Spring Security分離。然后將其注入需要訪問當前用戶的安全信息或信息的控制器。

另一個主要好處是很容易使用固定數據進行簡單的實現測試,而不必擔心填充線程本地等等。


查看完整回答
反對 回復 2019-07-25
  • 3 回答
  • 0 關注
  • 2455 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號