logo头像

From zero to HERO

Spring Security 实战干货: 集成验证码和小程序登录

最近实现了一个多端登录的Spring Security组件,用起来非常丝滑,开箱即用,可插拔,而且灵活性非常强。我觉得能满足大部分场景的需要。目前完成了手机号验证码和微信小程序两种自定义登录,加上默认的Form登录,一共三种,接下来简单介绍一下这个插件包。

DSL配置风格

切入正题,先来看看配置:

这种风格完全贴合了Spring SecurityDSL配置风格,不仅仅高大上,而且可以按需配置。如果你没有验证码登录直接删掉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 OAuth2Spring Authorization Server专栏,目前已经更新了45篇,图文并茂,附带DEMO,有希望提高自己的可以去订阅一下。

评论系统未开启,无法评论!