Spring Security組件一鍵接入驗(yàn)證碼登錄和小程序登錄的詳細(xì)過程
最近實(shí)現(xiàn)了一個(gè)多端登錄的Spring Security組件,用起來非常絲滑,開箱即用,可插拔,而且靈活性非常強(qiáng)。我覺得能滿足大部分場景的需要。目前完成了手機(jī)號驗(yàn)證碼和微信小程序兩種自定義登錄,加上默認(rèn)的Form登錄,一共三種,現(xiàn)在開源分享給大家,接下來簡單介紹一下這個(gè)插件包。
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 其它配置省略…… ) // 小程序登錄 同時(shí)支持多個(gè)小程序 .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緩存 過期時(shí)間應(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)證碼登錄和微信小程序登錄的都有。
為什么這么靈活?
這里抽象了一個(gè)登錄配置類:
public abstract class AbstractLoginFilterConfigurer<H extends HttpSecurityBuilder<H>, C extends AbstractLoginFilterConfigurer<H, C, F>, F extends AbstractAuthenticationProcessingFilter> extends AbstractHttpConfigurer<AbstractLoginFilterConfigurer<H, C, F>, H> { // 省略…… }
所有額外的登錄渠道大都可以通過這個(gè)類來擴(kuò)展,負(fù)責(zé)驗(yàn)證碼登錄的CaptchaLoginFilterConfigurer
和微信小程序登錄的MiniAppLoginFilterConfigurer
都是該類實(shí)現(xiàn)的,基本上你看了源碼也能照葫蘆畫瓢來一個(gè)。
另外上面這些配置項(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)文章
DoytoQuery中關(guān)于N+1查詢問題解決方案詳解
這篇文章主要為大家介紹了DoytoQuery中關(guān)于N+1查詢問題解決方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12詳解java封裝實(shí)現(xiàn)Excel建表讀寫操作
這篇文章給大家分享了java封裝實(shí)現(xiàn)Excel建表讀寫操作的相關(guān)知識點(diǎn)內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。2018-08-08解決Spring Cloud中Feign/Ribbon第一次請求失敗的方法
這篇文章主要給大家介紹了關(guān)于解決Spring Cloud中Feign/Ribbon第一次請求失敗的方法,文中給出了三種解決的方法,大家可以根據(jù)需要選擇對應(yīng)的方法,需要的朋友們下面來一起看看吧。2017-02-02ReentrantLock從源碼解析Java多線程同步學(xué)習(xí)
這篇文章主要為大家介紹了ReentrantLock從源碼解析Java多線程同步學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04使用Spring?Boot+gRPC構(gòu)建微服務(wù)并部署的案例詳解
這篇文章主要介紹了使用Spring?Boot+gRPC構(gòu)建微服務(wù)并部署,Spring Cloud僅僅是一個(gè)開發(fā)框架,沒有實(shí)現(xiàn)微服務(wù)所必須的服務(wù)調(diào)度、資源分配等功能,這些需求要借助Kubernetes等平臺來完成,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧2022-06-06