精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

SpringSecurity系列之查看登錄詳情

開發 架構
Authentication 接口用來保存我們的登錄用戶信息,實際上,它是對主體(java.security.Principal)做了進一步的封裝。

 [[398075]]

上篇文章跟大家聊了如何使用更加優雅的方式自定義 Spring Security 登錄邏輯,更加優雅的方式可以有效避免掉自定義過濾器帶來的低效,建議大家一定閱讀一下,也可以順便理解 Spring Security 中的認證邏輯。

本文將在上文的基礎上,繼續和大家探討如何存儲登錄用戶詳細信息的問題。

1.Authentication

Authentication 這個接口前面和大家聊過多次,今天還要再來聊一聊。

Authentication 接口用來保存我們的登錄用戶信息,實際上,它是對主體(java.security.Principal)做了進一步的封裝。

我們來看下 Authentication 的一個定義:

  1. public interface Authentication extends Principal, Serializable { 
  2.  Collection<? extends GrantedAuthority> getAuthorities(); 
  3.  Object getCredentials(); 
  4.  Object getDetails(); 
  5.  Object getPrincipal(); 
  6.  boolean isAuthenticated(); 
  7.  void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException; 

接口的解釋如下:

  1. getAuthorities 方法用來獲取用戶的權限。
  2. getCredentials 方法用來獲取用戶憑證,一般來說就是密碼。
  3. getDetails 方法用來獲取用戶攜帶的詳細信息,可能是當前請求之類的東西。
  4. getPrincipal 方法用來獲取當前用戶,可能是一個用戶名,也可能是一個用戶對象。
  5. isAuthenticated 當前用戶是否認證成功。

這里有一個比較好玩的方法,叫做 getDetails。關于這個方法,源碼的解釋如下:

Stores additional details about the authentication request. These might be an IP address, certificate serial number etc.

從這段解釋中,我們可以看出,該方法實際上就是用來存儲有關身份認證的其他信息的,例如 IP 地址、證書信息等等。

實際上,在默認情況下,這里存儲的就是用戶登錄的 IP 地址和 sessionId。我們從源碼角度來看下。

2.源碼分析

松哥的 SpringSecurity 系列已經寫到第 12 篇了,看了前面的文章,相信大家已經明白用戶登錄必經的一個過濾器就是 UsernamePasswordAuthenticationFilter,在該類的 attemptAuthentication 方法中,對請求參數做提取,在 attemptAuthentication 方法中,會調用到一個方法,就是 setDetails。

我們一起來看下 setDetails 方法:

  1. protected void setDetails(HttpServletRequest request, 
  2.   UsernamePasswordAuthenticationToken authRequest) { 
  3.  authRequest.setDetails(authenticationDetailsSource.buildDetails(request)); 

UsernamePasswordAuthenticationToken 是 Authentication 的具體實現,所以這里實際上就是在設置 details,至于 details 的值,則是通過 authenticationDetailsSource 來構建的,我們來看下:

  1. public class WebAuthenticationDetailsSource implements 
  2.   AuthenticationDetailsSource<HttpServletRequest, WebAuthenticationDetails> { 
  3.  public WebAuthenticationDetails buildDetails(HttpServletRequest context) { 
  4.   return new WebAuthenticationDetails(context); 
  5.  } 
  6. public class WebAuthenticationDetails implements Serializable { 
  7.  private final String remoteAddress; 
  8.  private final String sessionId; 
  9.  public WebAuthenticationDetails(HttpServletRequest request) { 
  10.   this.remoteAddress = request.getRemoteAddr(); 
  11.  
  12.   HttpSession session = request.getSession(false); 
  13.   this.sessionId = (session != null) ? session.getId() : null
  14.  } 
  15.     //省略其他方法 

默認通過 WebAuthenticationDetailsSource 來構建 WebAuthenticationDetails,并將結果設置到 Authentication 的 details 屬性中去。而 WebAuthenticationDetails 中定義的屬性,大家看一下基本上就明白,這就是保存了用戶登錄地址和 sessionId。

那么看到這里,大家基本上就明白了,用戶登錄的 IP 地址實際上我們可以直接從 WebAuthenticationDetails 中獲取到。

我舉一個簡單例子,例如我們登錄成功后,可以通過如下方式隨時隨地拿到用戶 IP:

  1. @Service 
  2. public class HelloService { 
  3.     public void hello() { 
  4.         Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 
  5.         WebAuthenticationDetails details = (WebAuthenticationDetails) authentication.getDetails(); 
  6.         System.out.println(details); 
  7.     } 

這個獲取過程之所以放在 service 來做,就是為了演示隨時隨地這個特性。然后我們在 controller 中調用該方法,當訪問接口時,可以看到如下日志:

  1. WebAuthenticationDetails@fffc7f0c: RemoteIpAddress: 127.0.0.1; SessionId: 303C7F254DF8B86667A2B20AA0667160 

可以看到,用戶的 IP 地址和 SessionId 都給出來了。這兩個屬性在 WebAuthenticationDetails 中都有對應的 get 方法,也可以單獨獲取屬性值。

3.定制

當然,WebAuthenticationDetails 也可以自己定制,因為默認它只提供了 IP 和 sessionid 兩個信息,如果我們想保存關于 Http 請求的更多信息,就可以通過自定義 WebAuthenticationDetails 來實現。

如果我們要定制 WebAuthenticationDetails,還要連同 WebAuthenticationDetailsSource 一起重新定義。

結合上篇文章的驗證碼登錄,我跟大家演示一個自定義 WebAuthenticationDetails 的例子。

上篇文章我們是在 MyAuthenticationProvider 類中進行驗證碼判斷的,回顧一下上篇文章的代碼:

  1. public class MyAuthenticationProvider extends DaoAuthenticationProvider { 
  2.  
  3.     @Override 
  4.     protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken authentication) throws AuthenticationException { 
  5.         HttpServletRequest req = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); 
  6.         String code = req.getParameter("code"); 
  7.         String verify_code = (String) req.getSession().getAttribute("verify_code"); 
  8.         if (code == null || verify_code == null || !code.equals(verify_code)) { 
  9.             throw new AuthenticationServiceException("驗證碼錯誤"); 
  10.         } 
  11.         super.additionalAuthenticationChecks(userDetails, authentication); 
  12.     } 

不過這個驗證操作,我們也可以放在自定義的 WebAuthenticationDetails 中來做,我們定義如下兩個類:

  1. public class MyWebAuthenticationDetails extends WebAuthenticationDetails { 
  2.  
  3.     private boolean isPassed; 
  4.  
  5.     public MyWebAuthenticationDetails(HttpServletRequest req) { 
  6.         super(req); 
  7.         String code = req.getParameter("code"); 
  8.         String verify_code = (String) req.getSession().getAttribute("verify_code"); 
  9.         if (code != null && verify_code != null && code.equals(verify_code)) { 
  10.             isPassed = true
  11.         } 
  12.     } 
  13.  
  14.     public boolean isPassed() { 
  15.         return isPassed; 
  16.     } 
  17. @Component 
  18. public class MyWebAuthenticationDetailsSource implements AuthenticationDetailsSource<HttpServletRequest,MyWebAuthenticationDetails> { 
  19.     @Override 
  20.     public MyWebAuthenticationDetails buildDetails(HttpServletRequest context) { 
  21.         return new MyWebAuthenticationDetails(context); 
  22.     } 

首先我們定義 MyWebAuthenticationDetails,由于它的構造方法中,剛好就提供了 HttpServletRequest 對象,所以我們可以直接利用該對象進行驗證碼判斷,并將判斷結果交給 isPassed 變量保存。如果我們想擴展屬性,只需要在 MyWebAuthenticationDetails 中再去定義更多屬性,然后從 HttpServletRequest 中提取出來設置給對應的屬性即可,這樣,在登錄成功后就可以隨時隨地獲取這些屬性了。

最后在 MyWebAuthenticationDetailsSource 中構造 MyWebAuthenticationDetails 并返回。

定義完成后,接下來,我們就可以直接在 MyAuthenticationProvider 中進行調用了:

  1. public class MyAuthenticationProvider extends DaoAuthenticationProvider { 
  2.  
  3.     @Override 
  4.     protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken authentication) throws AuthenticationException { 
  5.         if (!((MyWebAuthenticationDetails) authentication.getDetails()).isPassed()) { 
  6.             throw new AuthenticationServiceException("驗證碼錯誤"); 
  7.         } 
  8.         super.additionalAuthenticationChecks(userDetails, authentication); 
  9.     } 

直接從 authentication 中獲取到 details 并調用 isPassed 方法,有問題就拋出異常即可。

最后的問題就是如何用自定義的 MyWebAuthenticationDetailsSource 代替系統默認的 WebAuthenticationDetailsSource,很簡單,我們只需要在 SecurityConfig 中稍作定義即可:

  1. @Autowired 
  2. MyWebAuthenticationDetailsSource myWebAuthenticationDetailsSource; 
  3. @Override 
  4. protected void configure(HttpSecurity http) throws Exception { 
  5.     http.authorizeRequests() 
  6.             ... 
  7.             .and() 
  8.             .formLogin() 
  9.             .authenticationDetailsSource(myWebAuthenticationDetailsSource) 
  10.             ... 

將 MyWebAuthenticationDetailsSource 注入到 SecurityConfig 中,并在 formLogin 中配置 authenticationDetailsSource 即可成功使用我們自定義的 WebAuthenticationDetails。

這樣自定義完成后,WebAuthenticationDetails 中原有的功能依然保留,也就是我們還可以利用老辦法繼續獲取用戶 IP 以及 sessionId 等信息,如下:

  1. @Service 
  2. public class HelloService { 
  3.     public void hello() { 
  4.         Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 
  5.         MyWebAuthenticationDetails details = (MyWebAuthenticationDetails) authentication.getDetails(); 
  6.         System.out.println(details); 
  7.     } 

這里類型強轉的時候,轉為 MyWebAuthenticationDetails 即可。

本文案例大家可以從 GitHub 上下載:https://github.com/lenve/spring-security-samples

本文轉載自微信公眾號「江南一點雨」,可以通過以下二維碼關注。轉載本文請聯系江南一點雨公眾號。

 

責任編輯:武曉燕 來源: 江南一點雨
相關推薦

2021-07-02 10:45:53

SpringBootCAS登錄

2021-07-06 11:42:05

數據庫SpringSecurCAS

2021-04-21 10:38:44

Spring Boot RememberMe安全

2021-05-12 10:39:51

SpringSecurity設備

2020-04-29 15:10:16

Linux命令進程

2009-03-10 18:10:12

LinuxUbuntu技巧

2021-05-20 10:47:24

防火墻SpringSecur

2021-02-07 09:22:42

Zabbix5.2拓撲圖運維

2011-04-29 10:58:11

SimpleFrame

2021-07-07 21:40:46

Rust函數勸退

2023-01-06 08:18:44

2023-03-03 08:18:41

2021-12-06 09:44:30

鴻蒙HarmonyOS應用

2012-08-22 10:18:03

PHP

2012-01-13 15:59:07

2024-05-06 07:58:23

MoE模型系統

2011-04-29 09:33:22

SimpleFrame

2012-11-14 11:03:14

OSSEC文件檢查SYSCHECK

2021-06-09 08:53:34

設計模式策略模式工廠模式

2020-05-27 08:05:33

MybatisMapper接口
點贊
收藏

51CTO技術棧公眾號

日韩精品dvd| 特黄毛片在线观看| 国产乱子伦视频一区二区三区| 欧美大胆a视频| 91精品又粗又猛又爽| 2021中文字幕在线| 国产欧美精品在线观看| 亚洲精品欧美一区二区三区| 日本少妇久久久| 精品盗摄女厕tp美女嘘嘘| 欧美亚洲一区二区三区四区| 中文字幕一区综合| 色哟哟国产精品色哟哟| 老司机精品视频在线| 久久久久久久久久久人体| 亚洲无人区码一码二码三码的含义| 国产区一区二| 色狠狠av一区二区三区| 男人添女人下部视频免费| 国产在线日本| 成人久久18免费网站麻豆| 国产精品444| 日韩黄色在线视频| 性欧美69xoxoxoxo| 亚洲视频在线观看视频| 麻豆tv在线观看| 久久久久久久性潮| 色婷婷综合久久久中文一区二区 | 亚洲AV无码国产精品午夜字幕| 丝袜诱惑亚洲看片| 午夜精品久久17c| 亚洲国产成人精品综合99| 精品视频免费在线观看| 日韩经典中文字幕| 91精品人妻一区二区三区四区| 成人国产一区二区三区精品麻豆| 欧美日韩美女在线观看| 成人精品gif动图一区| 在线观看操人| 久久久无码人妻精品一区| 久久精品99久久久久久| 欧美亚洲国产精品久久| 欧美精品一区二区不卡| 亚洲午夜激情影院| 国产精品白丝喷水在线观看| 欧美精品资源| 色伊人久久综合中文字幕| 国产日韩av网站| 黄页网站在线| 亚洲一区中文在线| 九一免费在线观看| 欧美日韩在线视频免费| 国产精品9999久久久久仙踪林 | 成人在线直播| 日韩欧美中文在线观看| 亚洲色图20p| 秋霞毛片久久久久久久久| 四虎电影院在线观看| 成人av免费网站| 精品少妇一区二区三区在线视频| 欧美黄网在线观看| 日本免费在线观看| 综合av第一页| 国产资源第一页| 三级福利片在线观看| 亚洲永久免费视频| 日韩精品一区在线视频| 第一福利在线视频| 91美女主播在线视频| 国产人成视频在线观看| 91精品国产91久久久久| 欧美日韩国产第一页| 亚洲天堂av网站| 久久精品福利| 亚洲久久久久久久久久| 91国模少妇一区二区三区| 国产欧美高清视频在线| 综合激情国产一区| 日韩女优一区二区| 日韩一区二区久久| 国产精品极品美女在线观看免费| 亚洲天堂中文字幕在线| 国产精品影视天天线| 国产日产精品一区二区三区四区| 亚洲 小说区 图片区 都市| 久久久蜜臀国产一区二区| 午夜免费电影一区在线观看| 成人在线免费看片| 午夜精品久久一牛影视| 毛葺葺老太做受视频| 亚洲欧洲二区| 亚洲国产精品va在线看黑人| 国产熟女一区二区| 亚洲色图网站| 日本精品久久久| 亚洲手机在线观看| 不卡免费追剧大全电视剧网站| 欧美日韩高清在线一区| 爆操欧美美女| 一本高清dvd不卡在线观看| 一区二区在线免费看| 免费成人蒂法| 日韩在线激情视频| 欧美日韩综合在线观看| 久久国产精品露脸对白| 国产一区二区无遮挡| 91在线视频免费看| 亚洲成人精品一区| 亚洲免费成人在线视频| 色先锋久久影院av| 久久99国产精品自在自在app| 日韩在线 中文字幕| 国产精品一二三在| 亚洲国产另类久久久精品极度| 国产后进白嫩翘臀在线观看视频| 91久久精品网| 岛国精品资源网站| 亚洲成人99| 国产精品福利观看| 亚州男人的天堂| 一个色在线综合| 九九九九九国产| 国产成人精品一区二区免费看京| 欧美美女操人视频| 一级日韩一级欧美| 国产丝袜在线精品| 女性女同性aⅴ免费观女性恋| 蜜桃在线一区| 久久精品夜夜夜夜夜久久| www.国产毛片| 91视频精品在这里| 91免费黄视频| 亚洲精品一二三**| 久久精品国产一区二区电影| 一区两区小视频| 国产欧美一区二区三区鸳鸯浴| 777精品久无码人妻蜜桃| 日本成人精品| 九九热在线精品视频| 一道本在线视频| 国产精品欧美精品| 男人搞女人网站| 欧美日韩亚洲在线观看| 国产91久久婷婷一区二区| 三级理论午夜在线观看| 亚洲a一区二区| 久草视频福利在线| 亚洲激情精品| 久久99精品国产99久久| 老牛影视精品| 亚洲欧美第一页| 波多野结衣啪啪| 国产午夜精品一区二区三区嫩草| 妞干网在线免费视频| 自拍自偷一区二区三区| 国产亚洲一卡2卡3卡4卡新区 | 影音先锋亚洲精品| 欧美日韩五月天| 一区二区久久精品| 亚洲欧美综合久久久| 亚洲精品免费av| 国产高清在线a视频大全| 亚洲国产成人av在线| 97人人澡人人爽人人模亚洲| 97久久久精品综合88久久| 日本wwww视频| 欧美一二区在线观看| 国产精品美女无圣光视频| 日本中文字幕视频在线| 欧美一区二区高清| 亚洲国产精品成人无久久精品| 不卡的看片网站| 男人舔女人下面高潮视频| 日韩av密桃| 99re在线观看| 国产免费不卡| 精品国产网站地址| 黄色av免费观看| 色综合视频在线观看| 激情无码人妻又粗又大| 国产精品18久久久久久久久久久久| 97干在线视频| 国产一区二区亚洲| 5g国产欧美日韩视频| 老色鬼在线视频| 色婷婷成人综合| 亚洲乱码国产乱码精品精软件| 欧美视频专区一二在线观看| 日本污视频网站| 丁香桃色午夜亚洲一区二区三区| 男女曰b免费视频| 91精品国产乱码久久久久久 | 精品人妻一区二区三区三区四区| 午夜激情一区二区三区| 亚洲黄色网址大全| 国产69精品久久久久毛片| 国产精品天天av精麻传媒| 欧美成人日韩| 欧美乱偷一区二区三区在线| 国产精品国产三级在线观看| 欧美与黑人午夜性猛交久久久| 麻豆av在线免费看| 亚洲毛片在线看| 国产高潮在线观看| 欧美性大战久久久久久久| 黄色小说在线观看视频| 国产精品久久免费看| 特级西西人体4444xxxx| 国产一区二区三区av电影 | 青春草在线视频免费观看| 精品淫伦v久久水蜜桃| 成人免费视频网址| 国模一区二区| 992tv在线成人免费观看| 1区2区在线观看| 中日韩美女免费视频网址在线观看 | 一区二区三区在线播放视频| 2020日本不卡一区二区视频| 极品白嫩少妇无套内谢| 久久草av在线| 爱情岛论坛vip永久入口| 亚洲人体大胆视频| 欧美做暖暖视频| 外国成人免费视频| 亚洲精品二区| 欧美美女在线| 美脚丝袜一区二区三区在线观看| 三级欧美日韩| 亚洲一区二区三区香蕉| 亚洲人体在线| 国产自摸综合网| 成人自拍视频网| 国产成人在线亚洲欧美| 美女100%一区| 欧洲日韩成人av| 伊人网在线播放| 97av在线视频| 这里有精品可以观看| 国内精品久久久久久| 好看的中文字幕在线播放| 欧美丰满少妇xxxxx| 亚洲无线看天堂av| 欧美精品情趣视频| 日本天码aⅴ片在线电影网站| 久久精品电影网| 中文在线手机av| 久久91精品国产| 成人女同在线观看| 久久久久久国产| 激情国产在线| 亲爱的老师9免费观看全集电视剧| 忘忧草在线影院两性视频| 2018国产精品视频| 中文字幕乱码在线播放| 性色av一区二区三区在线观看| 国产免费拔擦拔擦8x高清在线人| 国外成人在线直播| 亚洲人成在线网站| 国产精品成人av性教育| 日韩黄色碟片| 亚洲一区二区三区四区视频| 一区中文字幕| 久久99精品久久久久久久青青日本| 偷拍自拍亚洲色图| 日韩av在线一区二区三区| 93在线视频精品免费观看| 在线无限看免费粉色视频| 欧美精品麻豆| 免费在线观看亚洲视频| 日韩精品亚洲专区| 天天影视色综合| 成人免费毛片片v| 男女黄床上色视频| 中文字幕五月欧美| 久久在线视频精品| 欧美性极品xxxx做受| 中文字幕第一页在线播放| 欧美一区二区久久久| 欧美天堂在线视频| 国产一区二区三区免费视频| 国产写真视频在线观看| 欧美—级高清免费播放| 韩国三级一区| 91在线看网站| 免费观看久久av| 99久re热视频精品98| 亚洲精品美女91| 日韩精品你懂的| 成人国产亚洲欧美成人综合网| www色com| 黄色成人av网| 91麻豆国产视频| 亚洲精品99久久久久中文字幕| www亚洲人| 97精品一区二区三区| 欧美天堂一区| 麻豆亚洲一区| 欧美成熟视频| 99re精彩视频| 2021国产精品久久精品| 欧美日韩国产精品综合| 色综合咪咪久久| 亚洲欧美另类视频| 日韩视频―中文字幕| 忘忧草在线日韩www影院| 99久久精品久久久久久ai换脸| 国产亚洲一区二区三区不卡| 日韩国产成人无码av毛片| 老司机精品视频导航| 国产全是老熟女太爽了| 亚洲一区二区影院| 国产又粗又猛又爽又黄视频 | av一本久道久久波多野结衣| 郴州新闻综合频道在线直播| www国产精品内射老熟女| 国产精品18久久久久久久久久久久| 成人在线手机视频| 欧美日韩国内自拍| 亚洲精品无amm毛片| 久久中文精品视频| 国产精品传媒麻豆hd| 欧美二区在线| 亚洲深夜av| 亚洲天堂美女视频| 亚洲午夜视频在线| 曰本三级日本三级日本三级| 日韩午夜影院| 午夜激情一区| 欧美丝袜自拍制服另类| 日韩欧美国产二区| 亚洲区小说区图片区qvod按摩| 日本一本草久p| 久久99精品久久久久久国产越南| 日韩精品无码一区二区三区久久久 | 久久夜色电影| 91免费版看片| 久久 天天综合| 91香蕉视频污在线观看| 欧美在线观看视频一区二区 | 国产剧情一区二区在线观看| 亚洲精蜜桃久在线| 美腿丝袜亚洲三区| 一本在线免费视频| 欧美日韩美少妇| 亚洲欧美视频一区二区| 国产精品日日摸夜夜添夜夜av| 狠狠操综合网| 杨幂毛片午夜性生毛片| 日本一二三不卡| 中文字幕人成人乱码亚洲电影| 国产亚洲视频在线观看| 8av国产精品爽爽ⅴa在线观看| 日韩精品一区二区三区四区五区| 日韩精品欧美精品| 亚洲一级理论片| 91精品国产综合久久香蕉的特点 | 亚洲va国产va欧美va观看| 高清乱码毛片入口| 91国产在线精品| 亚洲香蕉视频| 欧美一级特黄a| 亚洲欧洲av在线| 亚洲第一天堂影院| 91av免费观看91av精品在线| 九九综合在线| 亚洲欧美偷拍另类| 亚洲影院免费观看| 日韩美女一级视频| 国产精品久久久久久影视| 国产韩日影视精品| 日本wwwwwww| 日本乱人伦一区| 成人影欧美片| 精品在线视频一区二区三区| 日本欧洲一区二区| 国产极品国产极品| 日韩av在线资源| 国产精品久久久久久久久免费高清| 国产欧美综合一区| 99久久国产综合精品色伊| 涩涩视频在线观看| 91蜜桃在线视频| 欧美日韩精品综合在线| 老司机免费在线视频| 99久久精品无码一区二区毛片 | 欧美日本高清一区| 台湾色综合娱乐中文网| 久久婷五月综合| 亚洲一区自拍偷拍| www.在线视频.com| 国产成人亚洲欧美| 日韩电影一二三区| 久久精品波多野结衣| 亚洲天堂色网站| 婷婷综合国产| 五月婷婷深爱五月| 亚洲高清免费在线| 乱人伦中文视频在线| 鲁鲁狠狠狠7777一区二区| 国产一区二区视频在线|