1. 需求
希望可以通過引入 starter 即可支持認證方式。支持方式有
- 手機號+驗證碼(預(yù)留驗證碼實現(xiàn)接口類)
- 郵箱+驗證碼(預(yù)留驗證碼實現(xiàn)接口類)
- 微信認證(掃描認證)
- 企業(yè)微信(掃描認證)
- QQ認證(掃描認證)
2. 實現(xiàn)方式
2.1 核心實現(xiàn)原理說明
2.1.1 Security
采用 Spring Security 進行擴展相關(guān)的認證方式。通過 HttpSecurity 設(shè)置 authenticationProvider、addFilterAt。下面是代碼片段。
public void configure(HttpSecurity http, AuthenticationManager authenticationManager){
http.authenticationProvider(new SMSAuthenticationProvider())
.addFilterAt(new SMSAuthenticationFilter(authenticationManager), UsernamePasswordAuthenticationFilter.class);
}
- SMSAuthenticationFilter:Filter初始化(路徑、參數(shù)等)
- SMSAuthenticationProvider:核心認證邏輯
詳細 Security 認證相關(guān)原理請查看 https://zhuanlan.zhihu.com/p/336665767
還需要解決如何獲取到 HttpSecurity 對象進行
2.1.2 自動裝配
由于SpringBoot 的 starter 是通過 spring.factories 聲明的自動裝配類進行處理的。我們也需要聲明相關(guān)文件。達到引入依賴后就自動配置。此自動裝配無須任何代碼(但是需要把 AutoConfiguration 放到跟目錄,讓@ComponentScan 可以掃描的到)
@Configuration("sms-ac")
@ComponentScan
public class AutoConfiguration {
}
2.1.3 WebSecurityConfigurerAdapter 配置
由于每個認證組件都需要configure到過濾器鏈中去。所以需要回調(diào)各各認證方式的具體實現(xiàn)。
@Configuration
public class WebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
........
@Override
protected void configure(HttpSecurity http) throws Exception {
Collection<IAuthSecurityConfigurer> values = applicationContext.getBeansOfType(IAuthSecurityConfigurer.class).values();
for (IAuthSecurityConfigurer auth : values){
auth.configure(http, authenticationManager);
}
}
}
- IAuthSecurityConfigurer:回調(diào)接口類,認證starter注冊到容器中,這里在容器中獲取相關(guān)實現(xiàn)進行初始化即可。
以上就是完整的認證擴展過程,GItHub 地址:https://github.com/JerryDai90/frame-extend-case/tree/main/security/auth