<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
最近實現了一個多端登入的Spring Security元件,用起來非常絲滑,開箱即用,可插拔,而且靈活性非常強。我覺得能滿足大部分場景的需要。目前完成了手機號驗證碼和微信小程式兩種自定義登入,加上預設的Form登入,一共三種,現在開源分享給大家,接下來簡單介紹一下這個外掛包。
切入正題,先來看看設定:
@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
到此這篇關於Spring Security 一鍵接入驗證碼登入和小程式登入的文章就介紹到這了,更多相關Spring Security 一鍵接入登入內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45