Spring Security組件一鍵接入驗(yàn)證碼登錄和小程序登錄的詳細(xì)過程
最近實(shí)現(xiàn)了一個多端登錄的Spring Security組件,用起來非常絲滑,開箱即用,可插拔,而且靈活性非常強(qiáng)。我覺得能滿足大部分場景的需要。目前完成了手機(jī)號驗(yàn)證碼和微信小程序兩種自定義登錄,加上默認(rèn)的Form登錄,一共三種,現(xiàn)在開源分享給大家,接下來簡單介紹一下這個插件包。
DSL配置風(fēng)格
切入正題,先來看看配置:
@Bean
SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.mvcMatchers("/foo/**")
.access("hasAuthority('ROLE_USER')").anyRequest().authenticated()
.and()
// 默認(rèn)form表單登錄
.formLogin()
.and()
.apply(new LoginFilterSecurityConfigurer<>())
// 驗(yàn)證碼登錄
.captchaLogin(captchaLoginConfigurer ->
// 驗(yàn)證碼校驗(yàn) 1 在此處配置 優(yōu)先級最高 2 注冊為Spring Bean 可以免配置
captchaLoginConfigurer.captchaService(this::verifyCaptchaMock)
// 根據(jù)手機(jī)號查詢用戶UserDetials 1 在此處配置 優(yōu)先級最高 2 注冊為Spring Bean 可以免配置
.captchaUserDetailsService(this::loadUserByPhoneMock)
// 生成JWT 返回 1 在此處配置 優(yōu)先級最高 2 注冊為Spring Bean 可以免配置
.jwtTokenGenerator(this::tokenResponseMock)
//todo 其它配置省略……
)
// 小程序登錄 同時支持多個小程序
.miniAppLogin(miniAppLoginConfigurer -> miniAppLoginConfigurer
// 實(shí)現(xiàn)小程序多租戶
// 根據(jù)請求攜帶的clientid 查詢小程序的appid和secret 1 在此處配置 優(yōu)先級最高 2 注冊為Spring Bean 可以免配置
.miniAppClientService(this::miniAppClientMock)
// 小程序用戶 自動注冊和檢索 1 在此處配置 優(yōu)先級最高 2 注冊為Spring Bean 可以免配置
.miniAppUserDetailsService(new MiniAppUserDetailsServiceMock())
// 小程序sessionkey緩存 過期時間應(yīng)該小于微信官方文檔的聲明 1 在此處配置 優(yōu)先級最高 2 注冊為Spring Bean 可以免配置
.miniAppSessionKeyCache(new MiniAppSessionKeyCacheMock())
// 生成JWT 返回 1 在此處配置 優(yōu)先級最高 2 注冊為Spring Bean 可以免配置
.jwtTokenGenerator(this::tokenResponseMock)
//todo 其它配置省略……
);
return http.build();
}這種風(fēng)格完全貼合了Spring Security的DSL配置風(fēng)格,不僅僅高大上,而且可以按需配置。如果你沒有驗(yàn)證碼登錄直接刪掉captchaLogin方法;如果你沒有微信小程序登錄直接刪掉miniAppLogin方法。甚至還可以對單種登錄進(jìn)行細(xì)粒度定制化,formLogin有的功能基本驗(yàn)證碼登錄和微信小程序登錄的都有。
為什么這么靈活?
這里抽象了一個登錄配置類:
public abstract class AbstractLoginFilterConfigurer<H extends HttpSecurityBuilder<H>,
C extends AbstractLoginFilterConfigurer<H, C, F>,
F extends AbstractAuthenticationProcessingFilter>
extends AbstractHttpConfigurer<AbstractLoginFilterConfigurer<H, C, F>, H> {
// 省略……
}所有額外的登錄渠道大都可以通過這個類來擴(kuò)展,負(fù)責(zé)驗(yàn)證碼登錄的CaptchaLoginFilterConfigurer和微信小程序登錄的MiniAppLoginFilterConfigurer都是該類實(shí)現(xiàn)的,基本上你看了源碼也能照葫蘆畫瓢來一個。
另外上面這些配置項(xiàng)接口,都可以放在Spring IoC中,配置類能自動獲取,不過優(yōu)先級最高的還是通過上面代碼中配置的具體實(shí)現(xiàn),原理參見下面的的樣例:
@Override
protected AuthenticationSuccessHandler defaultSuccessHandler(H http) {
// 如果配置類沒有配置 就嘗試去Spring IoC中發(fā)現(xiàn)
if (this.jwtTokenGenerator == null) {
ApplicationContext applicationContext = http.getSharedObject(ApplicationContext.class);
jwtTokenGenerator = getBeanOrNull(applicationContext, JwtTokenGenerator.class);
}
Assert.notNull(jwtTokenGenerator, "jwtTokenGenerator is required");
return new LoginAuthenticationSuccessHandler(jwtTokenGenerator);
}
public final <T> T getBeanOrNull(ApplicationContext applicationContext, Class<T> beanType) {
String[] beanNames = applicationContext.getBeanNamesForType(beanType);
if (beanNames.length == 1) {
return applicationContext.getBean(beanNames[0], beanType);
}
return null;
}使用方法
自行使用Maven命令mvn install到本地倉庫,然后引入:
<dependency>
<groupId>cn.felord</groupId>
<artifactId>spring-security-extension</artifactId>
<version>1.0.0</version>
</dependency>然后參考樣例sample項(xiàng)目進(jìn)行開發(fā),登錄方式有三種。
普通登錄
原生Spring Security接口
POST /login?username=user&password=12345 HTTP/1.1 Host: localhost:8080
驗(yàn)證碼登錄
需要先實(shí)現(xiàn)必須的配置接口
發(fā)送驗(yàn)證碼后調(diào)用驗(yàn)證碼登錄接口:
POST /login/captcha?phone=11111111111&captcha=123123 HTTP/1.1 Host: localhost:8080
小程序登錄
需要先實(shí)現(xiàn)必須的配置接口
前端先調(diào)用微信授權(quán)登錄接口獲取openid:
POST /miniapp/preauth?clientId=wxxda23234&jsCode=051A23234ZHa1tZ5yj3AOlFr HTTP/1.1 Host: localhost:8080
響應(yīng):
{
"code": 200,
"data": {
"errcode": null,
"errmsg": null,
"sessionKey": null,
"openid": "oWmZj5QBrZxxxxx8OUxRrZJi4",
"unionid": "oS-dxxxxxx4w_x7dA-h9MIuA"
},
"msg": "",
"identifier": true
}然后調(diào)用小程序登錄接口:
POST /login/miniapp HTTP/1.1
Host: localhost:8080
Content-Type: application/json
{
"clientId": "wxd14qr6",
"openId": "oWmZj5QBrZIBks0xx8OUxRrZJi4",
"unionId": "oS-dK520tgW8xxxx7dA-h9MIuA",
"iv":"LQUOt8BSTa7xxxpe1Q==",
"encryptedData": "10hn3o4xxxxxrO/Ag5nRD3QkLSzduKnWuzN9B/H4Y0G5mDPR8siA7T8yaaqZsrMycLAoe2qrd1J75yYetYuWifiq3jUrcceRZHVxxl9LnQdW8f5+pMTnQtCYiMJ7Jm9paCw2Bh+5Lowkyqkx1q0fALvCQ9LXPPLAbLOB9CavRfKoenAmyyHQjZ/6lz0njzA=="
}獲取方式
Gitee: felord/spring-security-login-extension
到此這篇關(guān)于Spring Security 一鍵接入驗(yàn)證碼登錄和小程序登錄的文章就介紹到這了,更多相關(guān)Spring Security 一鍵接入登錄內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java 改造ayui表格組件實(shí)現(xiàn)多重排序
layui 的表格組件目前只支持單列排序,在實(shí)際應(yīng)用中并不能很好的支撐我們的業(yè)務(wù)需求。今天一時手癢,決定改造一番以支持多重排序。2021-04-04
SpringBoot訪問MongoDB數(shù)據(jù)庫的兩種方式
MongoDB是一種非關(guān)系型數(shù)據(jù)庫,通過文檔存儲數(shù)據(jù),適用于大規(guī)模數(shù)據(jù)存儲和高并發(fā)訪問,這篇文章主要介紹了SpringBoot訪問MongoDB數(shù)據(jù)庫的兩種方式,感興趣想要詳細(xì)了解可以參考下文2023-05-05
Java多線程之線程通信生產(chǎn)者消費(fèi)者模式及等待喚醒機(jī)制代碼詳解
這篇文章主要介紹了Java多線程之線程通信生產(chǎn)者消費(fèi)者模式及等待喚醒機(jī)制代碼詳解,具有一定參考價值,需要的朋友可以了解下。2017-10-10
Java源碼解析HashMap的tableSizeFor函數(shù)
今天小編就為大家分享一篇關(guān)于Java源碼解析HashMap的tableSizeFor函數(shù),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-01-01
簡述springboot及springboot cloud環(huán)境搭建
這篇文章主要介紹了簡述springboot及springboot cloud環(huán)境搭建的方法,包括spring boot 基礎(chǔ)應(yīng)用環(huán)境搭建,需要的朋友可以參考下2017-07-07
JAVA實(shí)現(xiàn)遍歷文件夾下的所有文件(遞歸調(diào)用和非遞歸調(diào)用)
本篇文章主要介紹了JAVA 遍歷文件夾下的所有文件(遞歸調(diào)用和非遞歸調(diào)用) ,具有一定的參考價值,有興趣的可以了解一下。2017-01-01
spring啟動后保證創(chuàng)建的對象不被垃圾回收器回收
最近看到一個問題是,spring在啟動后如何保證創(chuàng)建的對象不被垃圾回收器回收?。所以本文結(jié)合jvm的垃圾回收機(jī)制和spring中的源代碼做出自己的一點(diǎn)猜測。有需要的朋友們可以參考借鑒。2016-09-09

