最近實作了一個多端登錄的Spring Security組件,用起來非常絲滑,開箱即用,可插拔,而且靈活性非常強,我覺得能滿足大部分場景的需要,目前完成了手機號驗證碼和微信小程式兩種自定義登錄,加上默認的Form登錄,一共三種,現在開源分享給大家,接下來簡單介紹一下這個插件包,
DSL配置風格
切入正題,先來看看配置:
@Bean
SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.mvcMatchers("/foo/**")
.access("hasAuthority('ROLE_USER')").anyRequest().authenticated()
.and()
// 默認form表單登錄
.formLogin()
.and()
.apply(new LoginFilterSecurityConfigurer<>())
// 驗證碼登錄
.captchaLogin(captchaLoginConfigurer ->
// 驗證碼校驗 1 在此處配置 優先級最高 2 注冊為Spring Bean 可以免配置
captchaLoginConfigurer.captchaService(this::verifyCaptchaMock)
// 根據手機號查詢用戶UserDetials 1 在此處配置 優先級最高 2 注冊為Spring Bean 可以免配置
.captchaUserDetailsService(this::loadUserByPhoneMock)
// 生成JWT 回傳 1 在此處配置 優先級最高 2 注冊為Spring Bean 可以免配置
.jwtTokenGenerator(this::tokenResponseMock)
//todo 其它配置省略……
)
// 小程式登錄 同時支持多個小程式
.miniAppLogin(miniAppLoginConfigurer -> miniAppLoginConfigurer
// 實作小程式多租戶
// 根據請求攜帶的clientid 查詢小程式的appid和secret 1 在此處配置 優先級最高 2 注冊為Spring Bean 可以免配置
.miniAppClientService(this::miniAppClientMock)
// 小程式用戶 自動注冊和檢索 1 在此處配置 優先級最高 2 注冊為Spring Bean 可以免配置
.miniAppUserDetailsService(new MiniAppUserDetailsServiceMock())
// 小程式sessionkey快取 過期時間應該小于微信官方檔案的宣告 1 在此處配置 優先級最高 2 注冊為Spring Bean 可以免配置
.miniAppSessionKeyCache(new MiniAppSessionKeyCacheMock())
// 生成JWT 回傳 1 在此處配置 優先級最高 2 注冊為Spring Bean 可以免配置
.jwtTokenGenerator(this::tokenResponseMock)
//todo 其它配置省略……
);
return http.build();
}
這種風格完全貼合了Spring Security的DSL配置風格,不僅僅高大上,而且可以按需配置,如果你沒有驗證碼登錄直接刪掉captchaLogin方法;如果你沒有微信小程式登錄直接刪掉miniAppLogin方法,甚至還可以對單種登錄進行細粒度定制化,formLogin有的功能基本驗證碼登錄和微信小程式登錄的都有,
為什么這么靈活?
這里抽象了一個登錄配置類:
public abstract class AbstractLoginFilterConfigurer<H extends HttpSecurityBuilder<H>,
C extends AbstractLoginFilterConfigurer<H, C, F>,
F extends AbstractAuthenticationProcessingFilter>
extends AbstractHttpConfigurer<AbstractLoginFilterConfigurer<H, C, F>, H> {
// 省略……
}
所有額外的登錄渠道大都可以通過這個類來擴展,負責驗證碼登錄的CaptchaLoginFilterConfigurer和微信小程式登錄的MiniAppLoginFilterConfigurer都是該類實作的,基本上你看了原始碼也能照葫蘆畫瓢來一個,
另外上面這些配置項介面,都可以放在Spring IoC中,配置類能自動獲取,不過優先級最高的還是通過上面代碼中配置的具體實作,原理參見下面的的樣例:
@Override
protected AuthenticationSuccessHandler defaultSuccessHandler(H http) {
// 如果配置類沒有配置 就嘗試去Spring IoC中發現
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專案進行開發,登錄方式有三種,
普通登錄
原生Spring Security介面
POST /login?username=user&password=12345 HTTP/1.1
Host: localhost:8080
驗證碼登錄
需要先實作必須的配置介面
發送驗證碼后呼叫驗證碼登錄介面:
POST /login/captcha?phone=11111111111&captcha=123123 HTTP/1.1
Host: localhost:8080
小程式登錄
需要先實作必須的配置介面
前端先呼叫微信授權登錄介面獲取openid:
POST /miniapp/preauth?clientId=wxxda23234&jsCode=051A23234ZHa1tZ5yj3AOlFr HTTP/1.1
Host: localhost:8080
回應:
{
"code": 200,
"data": {
"errcode": null,
"errmsg": null,
"sessionKey": null,
"openid": "oWmZj5QBrZxxxxx8OUxRrZJi4",
"unionid": "oS-dxxxxxx4w_x7dA-h9MIuA"
},
"msg": "",
"identifier": true
}
然后呼叫小程式登錄介面:
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
關注公眾號:Felordcn 獲取更多資訊
個人博客:https://felord.cn
|
博主:碼農小胖哥 出處:felord.cn 本文著作權歸原作者所有,不可商用,轉載需要宣告出處,否則保留追究法律責任的權利,如果文中有什么錯誤,歡迎指出,以免更多的人被誤導, |
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/455505.html
標籤:其他
下一篇:事件監聽器
