国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:4日期:2023-08-24 14:16:38

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

1. 前言

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

2. UsernamePasswordAuthenticationFilter 源碼分析

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

public class UsernamePasswordAuthenticationFilter extends AbstractAuthenticationProcessingFilter { // 默認取賬戶名、密碼的keypublic 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對象中,這是就是一個通行證,但是這時的狀態時不可信的,一旦通過認證就變為可信的 UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken( username, password); // 會將 HttpServletRequest 中的一些細節 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); } // 參見上面對應的說明為憑據設置一些請求細節 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; }}

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

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

3. 我們可以定制什么

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

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

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

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

4. 我們會有什么疑問

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

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

標簽: Spring
相關文章:
主站蜘蛛池模板: 性欧美高清come | 欧美高清免费一级在线 | 亚洲欧美一区二区三区久本道 | 日本三级一区 | 色偷偷在线刺激免费视频 | 欧美日韩高清不卡免费观看 | 欧美性猛片xxxxⅹ免费 | 亚洲国产精品久久久久久网站 | 精品一区二区高清在线观看 | 成人羞羞视频国产 | 亚洲高清视频在线观看 | 国产成人精品一区二区免费视频 | 午夜性激福利免费观看 | 2017天天爽夜夜爽精品视频 | 久久国产三级精品 | 天堂8在线天堂资源bt | 女女互操 | 好吊妞998视频免费观看在线 | 亚洲第十色 | 久草在线播放视频 | 99精品久久99久久久久 | 久久一日本道色综合久久 | www.xxxx欧美| 在线观看人成网站深夜免费 | 一区二区三区四区产品乱码伦 | 米奇777第四久久久99 | 国产成人tv在线观看 | 香蕉视频老司机 | 国产主播大尺度精品福利 | 日韩中文字幕在线亚洲一区 | 有码一区| 97精品国产91久久久久久 | 韩国三级 mp4 | 欧美成人香蕉网在线观看 | 一级女性全黄生活片免费 | 成人a视频在线观看 | 久久免费香蕉视频 | 欧美三级真做在线观看 | 日韩在线二区全免费 | 一区二区三区在线视频观看 | 久久久久在线 |