最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

圖解Spring Security 中用戶是如何實現登錄的

 更新時間:2020年07月27日 11:35:00   作者:碼農小胖哥  
這篇文章主要介紹了圖解Spring Security 中用戶是如何實現登錄的,文中通過示例代碼和圖片介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

1. 前言

歡迎閱讀Spring Security 實戰(zhàn)干貨系列文章,在集成Spring Security安全框架的時候我們最先處理的可能就是根據我們項目的實際需要來定制注冊登錄了,尤其是Http登錄認證。根據以前的相關文章介紹,Http登錄認證由過濾器UsernamePasswordAuthenticationFilter 進行處理。我們只有把這個過濾器搞清楚才能做一些定制化。今天我們就簡單分析它的源碼和工作流程。

2. UsernamePasswordAuthenticationFilter 源碼分析

UsernamePasswordAuthenticationFilter 繼承于AbstractAuthenticationProcessingFilter(另文分析)。它的作用是攔截登錄請求并獲取賬號和密碼,然后把賬號密碼封裝到認證憑據UsernamePasswordAuthenticationToken中,然后把憑據交給特定配置的AuthenticationManager去作認證。源碼分析如下:

public class UsernamePasswordAuthenticationFilter extends
  AbstractAuthenticationProcessingFilter {
 // 默認取賬戶名、密碼的key
	public static final String SPRING_SECURITY_FORM_USERNAME_KEY = "username";
	public static final String SPRING_SECURITY_FORM_PASSWORD_KEY = "password";
 // 可以通過對應的set方法修改
	private String usernameParameter = SPRING_SECURITY_FORM_USERNAME_KEY;
	private String passwordParameter = SPRING_SECURITY_FORM_PASSWORD_KEY;
 // 默認只支持 POST 請求
	private boolean postOnly = true;
 
 // 初始化一個用戶密碼 認證過濾器 默認的登錄uri 是 /login 請求方式是POST
 public UsernamePasswordAuthenticationFilter() {
  super(new AntPathRequestMatcher("/login", "POST"));
 }

 // 實現其父類 AbstractAuthenticationProcessingFilter 提供的鉤子方法 用去嘗試認證
 public Authentication attemptAuthentication(HttpServletRequest request,
   HttpServletResponse response) throws AuthenticationException {
  // 判斷請求方式是否是POST
  if (postOnly && !request.getMethod().equals("POST")) {
   throw new AuthenticationServiceException(
    "Authentication method not supported: " + request.getMethod());
  }
  
  // 先去 HttpServletRequest 對象中獲取賬號名、密碼
  String username = obtainUsername(request);
  String password = obtainPassword(request);

  if (username == null) {
   username = "";
  }

  if (password == null) {
   password = "";
  }

  username = username.trim();

  // 然后把賬號名、密碼封裝到 一個認證Token對象中,這是就是一個通行證,但是這時的狀態(tài)時不可信的,一旦通過認證就變?yōu)榭尚诺?
  UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(
   username, password);

  // 會將 HttpServletRequest 中的一些細節(jié) request.getRemoteAddr() request.getSession 存入的到Token中
  setDetails(request, authRequest);

  // 然后 使用 父類中的 AuthenticationManager 對Token 進行認證 
  return this.getAuthenticationManager().authenticate(authRequest);
 }
 // 獲取密碼 很重要 如果你想改變獲取密碼的方式要么在此處重寫,要么通過自定義一個前置的過濾器保證能此處能get到
 @Nullable
 protected String obtainPassword(HttpServletRequest request) {
  return request.getParameter(passwordParameter);
 }

  // 獲取賬戶很重要 如果你想改變獲取密碼的方式要么在此處重寫,要么通過自定義一個前置的過濾器保證能此處能get到
 @Nullable
 protected String obtainUsername(HttpServletRequest request) {
  return request.getParameter(usernameParameter);
 }

 // 參見上面對應的說明為憑據設置一些請求細節(jié)
 protected void setDetails(HttpServletRequest request,
   UsernamePasswordAuthenticationToken authRequest) {
  authRequest.setDetails(authenticationDetailsSource.buildDetails(request));
 }

 // 設置賬戶參數的key
 public void setUsernameParameter(String usernameParameter) {
  Assert.hasText(usernameParameter, "Username parameter must not be empty or null");
  this.usernameParameter = usernameParameter;
 }

 // 設置密碼參數的key
 public void setPasswordParameter(String passwordParameter) {
  Assert.hasText(passwordParameter, "Password parameter must not be empty or null");
  this.passwordParameter = passwordParameter;
 }

 // 認證的請求方式是只支持POST請求
 public void setPostOnly(boolean postOnly) {
  this.postOnly = postOnly;
 }

 public final String getUsernameParameter() {
  return usernameParameter;
 }

 public final String getPasswordParameter() {
  return passwordParameter;
 }
}

為了加強對流程的理解,我特意畫了一張圖來對這個流程進行清晰的說明:

3. 我們可以定制什么

根據上面的流程,我們理解了UsernamePasswordAuthenticationFilter工作流程后可以做這些事情:

定制我們的登錄請求URI和請求方式。

登錄請求參數的格式定制化,比如可以使用JSON格式提交甚至幾種并存。

如何將用戶名和密碼封裝入憑據UsernamePasswordAuthenticationToken,定制業(yè)務場景需要的特殊憑據。

4. 我們會有什么疑問

AuthenticationManager從哪兒來,它又是什么,它是如何對憑據進行認證的,認證成功的后續(xù)細節(jié)是什么,認證失敗的后續(xù)細節(jié)是什么。不要走開,持續(xù)關注:碼農小胖哥 為你揭曉這個答案。

到此這篇關于圖解Spring Security 中用戶是如何實現登錄的的文章就介紹到這了,更多相關Spring Security  用戶 實現登錄內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • JAVA類變量及類方法代碼實例詳解

    JAVA類變量及類方法代碼實例詳解

    這篇文章主要介紹了JAVA類變量及類方法代碼實例詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • MyBatis中criteria的or(或查詢)語法說明

    MyBatis中criteria的or(或查詢)語法說明

    這篇文章主要介紹了MyBatis中criteria的or(或查詢)語法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java使用POI實現導出Excel的方法詳解

    Java使用POI實現導出Excel的方法詳解

    在項目開發(fā)中往往需要使用到Excel的導入和導出,導入就是從Excel中導入到DB中,而導出就是從DB中查詢數據然后使用POI寫到Excel上。本文將利用POI實現導出Excel,需要的可以參考一下
    2022-10-10
  • Spring mvc Json處理實現流程代碼實例

    Spring mvc Json處理實現流程代碼實例

    這篇文章主要介紹了Spring mvc Json處理實現流程代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • SpringBoot加載配置文件的實現方式總結

    SpringBoot加載配置文件的實現方式總結

    在實際的項目開發(fā)過程中,我們經常需要將某些變量從代碼里面抽離出來,放在配置文件里面,以便更加統(tǒng)一、靈活的管理服務配置信息。所以本文將為大家總結一下SpringBoot加載配置文件的常用方式,需要的可以參考一下
    2022-03-03
  • Java中HttpServletResponse響應中文出現亂碼問題

    Java中HttpServletResponse響應中文出現亂碼問題

    這篇文章主要介紹了Java中HttpServletResponse響應中文出現亂碼問題的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • Spring Core動態(tài)代理的實現代碼

    Spring Core動態(tài)代理的實現代碼

    通過JDK的Proxy方式或者CGLIB方式生成代理對象的時候,相關的攔截器已經配置到代理對象中去了,接下來通過本文給大家介紹Spring Core動態(tài)代理的相關知識,需要的朋友可以參考下
    2021-10-10
  • java數組排序示例(冒泡排序、快速排序、希爾排序、選擇排序)

    java數組排序示例(冒泡排序、快速排序、希爾排序、選擇排序)

    java中在運用數組進行排序功能時,一般有四種方法:快速排序法、冒泡法、選擇排序法、插入排序法(希爾排序(Shell Sort)是插入排序的一種),下面是一些示例,需要的朋友可以參考下
    2014-03-03
  • Java中文件管理系統(tǒng)FastDFS詳解

    Java中文件管理系統(tǒng)FastDFS詳解

    這篇文章主要介紹了Java中文件管理系統(tǒng)FastDFS詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • 使用jenkins+maven+git發(fā)布jar包過程詳解

    使用jenkins+maven+git發(fā)布jar包過程詳解

    這篇文章主要介紹了使用jenkins+maven+git發(fā)布jar包過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07

最新評論

徐闻县| 聂荣县| 广丰县| 西乌珠穆沁旗| 彰化市| 彭泽县| 中牟县| 鲁甸县| 理塘县| 中卫市| 台东县| 邯郸县| 家居| 夏河县| 玛沁县| 资源县| 桐梓县| 渝北区| 孝感市| 宝应县| 调兵山市| 淮北市| 嘉荫县| 右玉县| 新龙县| 河南省| 大同县| 定结县| 淮北市| 冕宁县| 屯留县| 濮阳县| 镇赉县| 陆川县| 龙江县| 禄丰县| 鄂州市| 禄劝| 永德县| 宝坻区| 汶川县|