SpringSecurity实现多种登录⽅式,邮件验证码、电话号码登录
不知道, 你在⽤Spring Security的时候,有没有想过,⽤它实现多种登录⽅式勒,这次我的⼩伙伴就给我提了⼀些登录⽅⾯的需求,需要在原有账号密码登录的基础上,另外实现电话验证码以及邮件验证码登录,以及在实现之后,让我能够做到实现第三⽅登录,如gitee、github等。
本⽂主要是讲解Security在实现账号密码的基础上,并且不改变原有业务情况下,实现邮件、电话验证码登录。
前⾔:
这对于已经学过⼀段时间,并且对Security已经有了解的⼩伙伴来说,还是⽐较合适的,但是对于我以及其他⼀些急于解决当下问题的⼩⽩,并不是那么友善。
⼀、理论知识
我们先思考⼀下这个流程⼤致是如何的?
填写邮件号码,获取验证码
输⼊获取到的验证码进⾏登录(登录的接⼝:/email/login,这⾥不能使⽤默认的/login,因为我们是扩展)
在⾃定义的过滤器EmailCodeAuthenticationFilter中获取发送过来的邮件号码及验证码,判断验证码是否正确,邮件账号是否为空等
封装成⼀个需要认证的Authentication,此处我们⾃定义实现为EmailCodeAuthenticationToken。
将 Authentiction 传给 AuthenticationManager接⼝中authenticate ⽅法进⾏认证处理
AuthenticationManager 默认是实现类为 ProviderManager ,ProviderManager ⼜委托给 AuthenticationProvider 进⾏处理
我们⾃定义⼀个EmailCodeAuthenticationProvider实现AuthenticationProvider,实现⾝份验证。
⾃定义的EmailCodeAuthenticationFilter继承了 AbstractAuthenticationProcessingFilter 抽象
类,AbstractAuthenticationProcessingFilter 在 successfulAuthentication ⽅法中对登录成功进⾏了处理,通过Context().setAuthentication() ⽅法将 Authentication 认证信息对象绑定到 SecurityContext即安全上下⽂中。
其实对于⾝份验证通过后的处理,有两种⽅案,⼀种是直接在过滤器重写successfulAuthentication,另外⼀种就是实现AuthenticationSuccessHandler来处理⾝份验证通过。
⾝份验证失败也是⼀样,可重写unsuccessfulAuthentication⽅法,也可以实现 AuthenticationFailureHandler来对⾝份验证失败进⾏处理。⼤致流程就是如此。从这个流程中我们可以知道,需要重写的组件有以下⼏个:
EmailCodeAuthenticationFilter:邮件验证登录过滤器
EmailCodeAuthenticationToken:⾝份验证令牌
EmailCodeAuthenticationProvider:邮件⾝份认证处理
AuthenticationSuccessHandler:处理登录成功操作
AuthenticationFailureHandler:处理登录失败操作
接下来,我是模仿着源码写出我的代码,建议⼤家可以在使⽤的时候,多去看看,我这⾥去除了⼀些不是和这个相关的代码。
来吧!!
web端登录⼆、EmailCodeAuthenticationFilter
我们需要重写的
EmailCodeAuthenticationFilter,实际继承了AbstractAuthenticationProcessingFilter抽象类,我们不会写,可以先看看它的默认实现UsernamePasswordAuthenticationFilter是怎么样的吗,抄作业这是⼤家的强项的哈。
public class UsernamePasswordAuthenticationFilter extends AbstractAuthenticationProcessingFilter {
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论