亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

圖解Spring Security 中用戶是如何實(shí)現(xiàn)登錄的

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

1. 前言

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

2. UsernamePasswordAuthenticationFilter 源碼分析

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

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

 // 實(shí)現(xiàn)其父類 AbstractAuthenticationProcessingFilter 提供的鉤子方法 用去嘗試認(rèn)證
 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();

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

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

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

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

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

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

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

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

 public final String getUsernameParameter() {
  return usernameParameter;
 }

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

為了加強(qiáng)對流程的理解,我特意畫了一張圖來對這個(gè)流程進(jìn)行清晰的說明:

3. 我們可以定制什么

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

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

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

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

4. 我們會有什么疑問

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

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

相關(guān)文章

  • Java8中Optional的一些常見錯(cuò)誤用法總結(jié)

    Java8中Optional的一些常見錯(cuò)誤用法總結(jié)

    我們知道 Java 8 增加了一些很有用的 API, 其中一個(gè)就是 Optional,下面這篇文章主要給大家介紹了關(guān)于Java8中Optional的一些常見錯(cuò)誤用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-07-07
  • springboot上傳文件并返回url過程

    springboot上傳文件并返回url過程

    這篇文章主要介紹了springboot上傳文件并返回url過程,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Spring注解方式防止重復(fù)提交原理詳解

    Spring注解方式防止重復(fù)提交原理詳解

    這篇文章主要為大家詳細(xì)介紹了Spring注解方式防止重復(fù)提交原理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • SpringCloud的Hystrix簡單介紹

    SpringCloud的Hystrix簡單介紹

    這篇文章主要介紹了SpringCloud的Hystrix簡單介紹,SpringCloud Hystrix是Netflix開源的一款容錯(cuò)框架,具備服務(wù)降級,服務(wù)熔斷,依賴隔離,監(jiān)控(Hystrix Dashboard)等功能,同樣具有自我保護(hù)能力,需要的朋友可以參考下
    2023-07-07
  • Java消息隊(duì)列Kafka的簡單概述

    Java消息隊(duì)列Kafka的簡單概述

    這篇文章主要介紹了Java消息隊(duì)列Kafka的簡單概述,消息系統(tǒng)負(fù)責(zé)將數(shù)據(jù)從一個(gè)應(yīng)用程序傳輸?shù)搅硪粋€(gè)應(yīng)用程序,應(yīng)用程序可以專注于數(shù)據(jù),不擔(dān)心如何共享它,需要的朋友可以參考下
    2023-07-07
  • Idea springboot如何實(shí)現(xiàn)批量啟動微服務(wù)

    Idea springboot如何實(shí)現(xiàn)批量啟動微服務(wù)

    這篇文章主要介紹了Idea springboot如何實(shí)現(xiàn)批量啟動微服務(wù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 淺談java多線程wait,notify

    淺談java多線程wait,notify

    這篇文章主要介紹了java多線程wait,notify,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,下面小編和大家一起來學(xué)習(xí)一下吧
    2019-05-05
  • Spring?Boot請求處理之常用參數(shù)注解使用教程

    Spring?Boot請求處理之常用參數(shù)注解使用教程

    這篇文章主要給大家介紹了關(guān)于Spring?Boot請求處理之常用參數(shù)注解使用的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-03-03
  • 聊聊Spring Cloud Cli 初體驗(yàn)

    聊聊Spring Cloud Cli 初體驗(yàn)

    這篇文章主要介紹了聊聊Spring Cloud Cli 初體驗(yàn),SpringBoot CLI 是spring Boot項(xiàng)目的腳手架工具。非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2018-04-04
  • Java程序命令行參數(shù)用法總結(jié)

    Java程序命令行參數(shù)用法總結(jié)

    這篇文章主要介紹了Java程序命令行參數(shù)用法總結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評論