Spring Security 实战干货: 集成验证码和小程序登录
最近实现了一个多端登录的Spring Security组件,用起来非常丝滑,开箱即用,可插拔,而且灵活性非常强。我觉得能满足大部分场景的需要。目前完成了手机号验证码和微信小程序两种自定义登录,加上默认的Form登录,一共三种,接下来简单介绍一下这个插件包。
DSL配置风格
切入正题,先来看看配置:
这种风格完全贴合了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;
}
获取方式
公众号码农小胖哥
回复 sslogin 即可获得。
灵感来源
该设计的灵感思路来自于对Spring Security架构的解读,相关的技术细节不再多说,原理都来自胖哥开源的2021开工福利和2022开工福利两个PDF,公众号菜单有直达链接,有兴趣的可以学习学习去。
另外胖哥正在编写最新最干的Spring Security OAuth2和Spring Authorization Server专栏,目前已经更新了45篇,图文并茂,附带DEMO,有希望提高自己的可以去订阅一下。
评论系统未开启,无法评论!