成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spring Security 實戰干貨:如何獲取當前用戶信息

開發 架構
今天總結了如何在Spring Security獲取當前用戶的各種方法,它們的各自場景都略有不同,你可以根據這些羅列選擇最適合你的應用場景。

[[402489]]

在某些場景中我們需要獲取當前的用戶是誰?如果你使用了Spring Secrity作為安全框架你可以通過以下手段獲取當前用戶。

SecurityContext

無論是有狀態的Session模式還是流行的JWT模式你都可以通過SecurityContext來獲取當前的用戶:

  1. Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 
  2. String currentPrincipalName = authentication.getName(); 

當然這種方式是不夠嚴謹的,如果接口允許匿名訪問很可能返回一個匿名用戶,而匿名用戶并不能直接通過getName獲取,所以我們需要優化上面的邏輯為:

  1. Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 
  2. if (!(authentication instanceof AnonymousAuthenticationToken)) { 
  3.     String currentUserName = authentication.getName(); 
  4.     return currentUserName; 
  5. }else
  6.     throw RuntimeException("No User"

其實我平常使用這種方式的最多,我喜歡使用一個抽象的父類控制器來封裝獲取當前用戶的方法。

Principal

java.security.Principal對象也可以獲取當前的用戶信息,在Spring Security中該對象表現為Authentication對象,如果我們在Spring MVC接口中定義Principal對象也可以獲取當前用戶:

  1. @GetMapping("/currentusername"
  2. public String currentUserName(Principal principal) { 
  3.         return principal.getName(); 

同理Authentication對象也是可以的:

  1. @GetMapping("/currentusername"
  2. public String currentUserName(Authentication authentication) { 
  3.        return authentication.getName(); 

AuthenticationPrincipal

很多時候我們自定義了用戶對象UserDetails, 我們可以通過Spring Security 4.0提供的注解@AuthenticationPrincipal來獲取當前用戶的自定義UserDetails對象。如果CustomUser是UserDetails的實現,那么我們可以:

  1. @GetMapping("/currentusername"
  2.  public String currentUserName(@AuthenticationPrincipal CustomUser customUser) { 
  3.    return customUser.getUsername(); 

更簡單點的話:

  1. @GetMapping("/currentusername"
  2.  public String currentUserName(@AuthenticationPrincipal(expression = "username") String username) { 
  3.    return username; 

這需要CustomUser包含一個getUsername方法。

甚至我們自定義一個注解也是可以的:

  1. @Target({ElementType.PARAMETER, ElementType.TYPE}) 
  2. @Retention(RetentionPolicy.RUNTIME) 
  3. @Documented 
  4. @AuthenticationPrincipal 
  5. public @interface CurrentUser {} 

CurrentSecurityContext

Spring Security 5 提供了一個新的注解@CurrentSecurityContext來獲取當前用戶的安全上下文,你可以:

  1. @GetMapping("/currentusername"
  2. public String currentUserName(@CurrentSecurityContext(expression = "authentication")  
  3.   Authentication authentication) { 
  4.         return authentication.getName(); 

當然你還可以通過expression參數聲明SpEL表達式來獲取其它屬性,例如獲取Principal對象:

  1. @GetMapping("/principal"
  2. public String getPrincipal(@CurrentSecurityContext(expression = "authentication.principal")  
  3.   Principal principal) {  
  4.     return principal.getName();  

HttpServletRequest

據說HttpServletRequest的getUserPrincipal()方法也可以,但是我沒有用過,感興趣的同學可以試試能不能在Spring Security框架中直接通過該方法獲取。

總結

今天總結了如何在Spring Security獲取當前用戶的各種方法,它們的各自場景都略有不同,你可以根據這些羅列選擇最適合你的應用場景。

本文轉載自微信公眾號「碼農小胖哥」,可以通過以下二維碼關注。轉載本文請聯系碼農小胖哥公眾號。

 

責任編輯:武曉燕 來源: 碼農小胖哥
相關推薦

2021-04-23 07:33:10

SpringSecurity單元

2021-01-28 09:50:29

分布式對象SharedObjec

2021-04-19 07:33:04

WebSecuritySpringHttpSecurit

2019-11-22 09:40:40

SpringJava編程語言

2022-03-22 08:03:22

Spring動態認證數據庫

2017-04-28 11:15:26

大數據用戶畫像技術

2021-07-06 23:48:45

.NET用戶信息

2020-09-16 08:07:54

權限粒度Spring Secu

2021-05-31 10:47:17

SpringSecuritySession

2021-12-28 11:13:05

安全認證 Spring Boot

2022-05-19 11:29:14

計時攻擊SpringSecurity

2021-08-05 10:40:37

加密方案Spring

2021-08-29 18:36:57

項目

2009-07-21 16:49:41

整合iBatis和SpSqlMapClien

2025-02-26 09:03:24

2020-06-17 14:40:49

用戶頁面前端

2022-08-30 08:50:07

Spring權限控制

2022-08-15 08:42:46

權限控制Spring

2022-08-30 08:36:13

Spring權限控制

2022-08-30 08:55:49

Spring權限控制
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日一区二区三区 | 一二三四在线视频观看社区 | 亚洲一区国产 | 欧美三级电影在线播放 | 国产色网站 | 国产精品久久久久久久久久久久 | 欧美a在线看 | 99国产精品久久久 | 在线永久看片免费的视频 | a网站在线观看 | 亚洲va在线va天堂va狼色在线 | 国产成人jvid在线播放 | 久久久久久国产精品免费免费狐狸 | 97精品超碰一区二区三区 | 成人国产精品一级毛片视频毛片 | 91一区二区三区 | 欧美一卡二卡在线观看 | 久久青| 精品国产三级 | 久久久日韩精品一区二区三区 | 日韩精品a在线观看图片 | 在线观看国产h | 欧美一区二区视频 | 国产成人精品久久二区二区91 | 亚州综合一区 | 欧美日韩a| 亚洲精品小视频在线观看 | 91精品国产高清一区二区三区 | 欧美亚洲视频 | 刘亦菲国产毛片bd | 亚洲视频在线一区 | 欧美一级片在线观看 | 黄色三级免费 | 久久久噜噜噜久久中文字幕色伊伊 | 两性午夜视频 | 国产精品视频久久 | 欧美国产视频一区二区 | 久久a久久 | 国产精品波多野结衣 | 亚洲天堂av在线 | 一级免费a |