Spring-Security 認(rèn)證流程分析及多方式登錄認(rèn)證實(shí)踐
共 6415字,需瀏覽 13分鐘
·
2024-08-18 07:34
閱讀本文大概需要 4 分鐘。
來(lái)自:juejin.cn/post/7329144188926967860
1 前言
spring-security,在本文中將介紹 spring-security 的工作流程和實(shí)踐應(yīng)用,并基于此總結(jié)其使用心得和項(xiàng)目配置關(guān)鍵。
2 spring security 認(rèn)證和權(quán)限流程
DefaultSecurityFilterChain,綠色的部分負(fù)責(zé)用戶認(rèn)證,藍(lán)色的部分處理認(rèn)證異常的情況,橙色的部分負(fù)責(zé)用戶的授權(quán),最終請(qǐng)求到控制器的方法。在認(rèn)證完成之后,會(huì)將用戶認(rèn)證的結(jié)果 Authentication 放進(jìn) SecurityContextHolder 中,從中可以獲取到用戶信息。
-
SecurityContextHolder: 存放身份信息的容器 -
Authentication: 用戶信息的抽象即 security 的認(rèn)證主體 -
AbstractAuthenticationToken: authentication即認(rèn)證主體的抽象類, -
AuthenticationManager: 身份認(rèn)證器接口,具體實(shí)現(xiàn)類為 ProviderManager -
AuthenticationProvider: 用來(lái)處理 authentication的認(rèn)證信息 -
AuthenticationSuccessHandler 認(rèn)證成功處理器 -
AuthenticationFailureHandler 認(rèn)證失敗處理器
authentication 封裝其認(rèn)證方法,通過(guò) AuthenticationProvider 來(lái)進(jìn)行處理認(rèn)證。獲取身份信息會(huì)按照其配置provider的順序來(lái)處理。
Authentication下的實(shí)現(xiàn)類UsernamePasswordAuthenticationToken, 通常是用戶密碼的登錄方式。
AuthenticationManager 身份管理器,通過(guò)其配置的provider 驗(yàn)證這個(gè)UsernamePasswordAuthenticationToken 的信息。
AuthenticationManager.authentication身份管理器返回一個(gè)Authentication實(shí)例(上下文中包含權(quán)限信息,身份信息,細(xì)節(jié)信息,但是密碼會(huì)被移除)。
SecurityContextHolder 上下文容器會(huì)填充UsernamePasswordAuthenticationToken信息,通過(guò) SecurityContextHolder.getContext().setAuthentication()方法可以查看其上下文用戶信息。
3 spring security 登錄配置
-
登錄請(qǐng)求不攔截 permitAll -
資源需要某些角色 hasRole -
資源訪問(wèn)需要某些權(quán)限 hasAuthority -
其它的資源需要經(jīng)過(guò)認(rèn)證,在資源權(quán)限上的配置也可以通過(guò)注解的方式在控制器中設(shè)置
successForwardUrl 是請(qǐng)求轉(zhuǎn)發(fā)的方式,defaultSuccessUrl是重定向的方式。
session 和 authentication 的處理。
session 的管理,通常情況下在前后端不分離的情況下,需要用 session 進(jìn)行管理,在前后端分離的情況下,一般通過(guò) token 的方式來(lái)存儲(chǔ)用戶信息。maximumSessions 表示最大的用戶登錄數(shù)量。
accessDeniedHandler 即權(quán)限異常處理器
token 的配置信息,以及記住我的參數(shù)信息。
csrf/cors/frameoptions/cache 的配置方式。
addFilterAt/addFilterAfter/addFilterBefore 的方式來(lái)處理自定義的過(guò)濾器。
spring-security 的其它配置如下所示,可以配置信息提示的國(guó)際化,身份認(rèn)證的方式,自定義 AuthenticationManager,以及配置token 的持久化方式,這里包括內(nèi)存方式和數(shù)據(jù)庫(kù)方式。
KaptchaFilter 是用來(lái)配置驗(yàn)證碼的處理,通常情況下登錄需要需要 post 的方式,對(duì)于驗(yàn)證碼的處理方式,需要先生成驗(yàn)證碼存儲(chǔ)到內(nèi)存中,然后登錄時(shí)需要攜帶驗(yàn)證碼參數(shù)來(lái)進(jìn)行校驗(yàn)而后進(jìn)行下一個(gè)過(guò)濾器處理。
http method 保持一致。
4 spring security 表單認(rèn)證流程
SecurityContextPersistenceFilter 攔截所有的請(qǐng)求,共享會(huì)話將 session 中的 SecurityContext 信息放進(jìn)線程上下文中。
AbstractAuthenticationProcessingFilter 判斷是否需要認(rèn)證,需要認(rèn)證就獲取認(rèn)證 Authentication,然后放進(jìn) session 中。
UsernamePasswordAuthenticationFilter 創(chuàng)建 UsernamePasswordAuthenticationToken 進(jìn)行認(rèn)證,委托 ProviderManager (即 AuthenticationManager) 發(fā)起認(rèn)證,由多個(gè) AuthenticationProvider 接口列表組成進(jìn)行循環(huán)處理。
DaoAuthenticationProvider 調(diào)用 UserDetailsService 方法進(jìn)行用戶查詢,最終返回 AuthenticationToken 即 UsernamePasswordAuthenticationToken
ExceptionTranslationFilter 進(jìn)行處理
FilterSecurityInterceptor 中體現(xiàn),判斷用戶是否有權(quán)限訪問(wèn)資源。
5 手機(jī)號(hào)和郵箱驗(yàn)證碼登錄
spring security 認(rèn)證相關(guān)的內(nèi)容,通常情況下,系統(tǒng)的登錄不僅有賬號(hào)密碼登錄,還有手機(jī)號(hào)驗(yàn)證碼、第三方授權(quán)等登錄多種方式,在接下來(lái)將要介紹的就是手機(jī)號(hào)驗(yàn)證碼登錄和郵箱登錄的方式。
-
繼承 AbstractAuthenticationProcessingFilter,重寫attemptAuthentication用于獲取登錄提交參數(shù),并校驗(yàn)驗(yàn)證碼是否正確 -
繼承 AuthenticationProvider,重寫authenticate方法,從數(shù)據(jù)庫(kù)查詢用戶信息,并完成AuthenticationToken對(duì)象封裝。 -
繼承 AbstractAuthenticationToken, 重寫構(gòu)造方法,完成對(duì)象封裝以及授權(quán)。
-
調(diào)用發(fā)送驗(yàn)證碼接口,發(fā)送驗(yàn)證碼,本例是在控制臺(tái)打印驗(yàn)證碼。 -
通過(guò)表單或者json格式都可以提交信息完成認(rèn)證。 -
用戶認(rèn)證成功或者失敗時(shí),通過(guò)認(rèn)證成功或者失敗處理器進(jìn)行處理,返回 json 數(shù)據(jù)格式或者是頁(yè)面。
spring security 相關(guān)的認(rèn)證流程和認(rèn)證成功的處理方式,此外,還可以通過(guò)如下方式,通過(guò)注入 AuthenticationManager 調(diào)用認(rèn)證方式來(lái)處理用戶認(rèn)證信息。
6 總結(jié)
spring security 登錄相關(guān)的核心配置,以及驗(yàn)證碼方式登錄的實(shí)踐, spring security 作為系統(tǒng)開(kāi)發(fā)中常用的權(quán)限認(rèn)證框架,在此基礎(chǔ)上拓展了項(xiàng)目的多種登錄方式,即手機(jī)驗(yàn)證碼和郵箱驗(yàn)證碼的方式,同時(shí)也介紹了前后端分離與不分離情況下的差異。
spring security 常用的使用方式,可以很好的為后續(xù)開(kāi)發(fā)提供借鑒。所涉及的代碼已經(jīng)上傳至 gitee:https://gitee.com/xieyue86/springsecurity-learn
推薦閱讀:
Java8中一個(gè)極其強(qiáng)悍的新接口,炸裂!很多人沒(méi)用過(guò)
幾行代碼,搞定 SpringBoot 接口惡意刷新和暴力請(qǐng)求!
程序員在線工具站:cxytools.com 推薦一個(gè)自己寫的工具站:http://cxytools.com,專為程序員設(shè)計(jì),包括時(shí)間日期、JSON處理、SQL格式化、隨機(jī)字符串生成、UUID生成、文本Hash...等功能,提升開(kāi)發(fā)效率。
?戳閱讀原文直達(dá)! 朕已閱 ![]()
評(píng)論
圖片
表情
