最近实现了一个多终端登录SpringSecurity组件,使用起来非常丝滑,开箱即用,可插拔,非常灵活。我认为它可以满足大多数场景的需求。目前已经完成手机号验证码和微信小程序两种自定义登录,加上默认的Form登录。现在开源出来分享给大家。下面简单介绍一下这个插件包。DSL配置风格切入正题,先看配置:@BeanSecurityFilterChaindefaultSecurityFilterChain(HttpSecurityhttp)throwsException{http.csrf().disable().authorizeRequests().mvcMatchers("/foo/**")。access("hasAuthority('ROLE_USER')").anyRequest().authenticated().and()//默认表单login.formLogin().and().apply(newLoginFilterSecurityConfigurer<>())//验证码login.captchaLogin(captchaLoginConfigurer->//验证码验证1这里配置了最高优先级2注册为SpringBean,不需要配置最高优先级2注册为SpringBean没有配置.captchaUserDetailsS??ervice(this::loadUserByPhoneMock)//生成JWT,返回1,这里配置最高优先级2,注册为SpringBean,避免配置。jwtTokenGenerator(this::tokenResponseMock)//todo其他配置省略...)//小程序登录支持多个小程序同时登录。miniAppLogin(miniAppLoginConfigurer->miniAppLoginConfigurer//实现小程序的多租户//根据请求携带的clientid查询小程序的appid和secret1这里的配置优先级最高2注册为Spring避免配置的BeanminiAppClientService(this::miniAppClientMock)//自动注册和获取小程序用户1.这里的配置优先级最高为2.注册为SpringBean可以节省配置miniAppUserDetailsS??ervice(newMiniAppUserDetailsS??erviceMock())//小程序sessionkey缓存过期时间要小于官方微信文档中的声明1这里的配置优先级最高为2注册为SpringBean,避免配置miniAppSessionKeyCache(newMiniAppSessionKeyCacheMock())//生成JWT返回1,这里的配置优先级最高。2、注册为SpringBean可以避免配置。jwtTokenGenerator(this::tokenResponseMock)//todo其他配置省略...);返回http.build();SpringSecurity的DSL配置风格不仅高大上,而且可以按需配置。如果没有验证码登录,直接删除captchaLogin方法;如果没有微信小程序登录,直接删除miniAppLogin方法。甚至可以对单一类型的登录进行细粒度定制。FormLogin有基本的验证码登录和微信小程序登录。为什么如此灵活?这里抽象一个:公共摘要类摘要摘要loginfilterconfigurer,c,c,c,ctresctractloginfilterconfigurerabractivetracksabresptionfecress,H>{//省略...}所有额外的登录通道都可以通过这个类来扩展。负责验证码登录的CaptchaLoginFilterConfigurer和微信小程序登录的MiniAppLoginFilterConfigurer都是由该类实现的。基本上看完源码就可以跟着葫芦画瓢了。另外,上面的配置项接口可以放在SpringIoC中,自动获取配置类,但是优先级最高的还是通过上面代码中配置的具体实现。原理看下面的例子:@OverrideprotectedAuthenticationSuccessHandlerdefaultSuccessHandler(Hhttp){//如果没有配置配置类,尝试在SpringIoC中查找if(this.jwtTokenGenerator==null){ApplicationContextapplicationContext=http.getSharedObject(ApplicationContext.class);jwtgentokeneratorContext=getBeanokNull(;}assert.notnull(jwttokengenerator,“必需jwttokengenerator”);返回新的LoginAuthentIcationSuccessCessHandler(jwttokengenerator)beanNames=applicationContext.getBeanNamesForType(beanType);if(beanNames.length==1){returnapplicationContext.getBean(beanNames[0],beanType);}returnnull;}自己用Maven命令mvninstall到本地仓库,然后导入:cn.felordspring-security-extension1.0.0然后参考sample示例工程进行开发。一共有三种登录方式普通登录SpringSecurity原生接口POST/login?username=user&password=12345HTTP/1.1Host:localhost:8080验证码登录需要先实现必要的配置接口发送验证码并调用验证码登录接口:POST/login/captcha?phone=11111111111&captcha=123123HTTP/1.1Host:localhost:8080小程序登录需要先实现必要的配置接口。前端先调用微信授权登录接口获取openid:POST/miniapp/preauth?clientId=wxxda23234&jsCode=051A23234ZHa1tZ5yj3AOlFrHTTP/1.1Host:localhost:8080response:{"code":200,"data":{"errcode":null,"errmsg":null,"sessionKey":null,"openid":"oWmZj5QBrZxxxxx8OUxRrZJi4","unionid":"oS-dxxxxxx4w_x7dA-h9MIuA"},"msg":"","identifier":true}然后调用小程序登录接口:POST/login/miniappHTTP/1.1Host:localhost:8080Content-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