Spring Security实现短信验证码登陆

Spring Security默认的一个实现是使用用户名密码登陆,当初咱们在开始作项目时,也是先使用这种登陆方式,并无多考虑其余的登陆方式。然后面需求愈来愈多,咱们须要支持短信验证码登陆了,这时候再看了解Spring Security中如何实现短信验证码登陆。数据库

这里有一篇文章:SpringBoot 集成 Spring Security(8)——短信验证码登陆,提供了一种比较正规的方法来解决这个问题,好比须要写filter类等等。可是咱们须要临时性解决这个问题,因而就经过了其它很是规手段来实现。后端

咱们知道默认的方式是,数据库里的user表保存了username和password,其中后者是密文保存。当用户登陆时,Spring Security会拿用户传过来的密码进行加密后和数据库中password的值进行比较,相同则登陆成功。若是是短信登陆,须要传入的是手机号和验证码,好比叫phone和verification_code。加密

在咱们的数据库中,username和phone都是惟一的,那咱们想达到的效果就是,让对phone和 verification_code的校验转变成对username和password的校验就行了。这样一来,实现的逻辑以下:.net

在user表中添加一个字段verification_code,等用户获取手机验证码时,后端将返回给用户的验证码进行加密,加密方式和对password的处理同样,而后保存到 verification_code 字段中。而后用户在输入手机号和验证码登陆时,咱们根据手机号获取用户的username,而后将username和验证码传给获取token的接口,让这个接口觉得咱们使用的是用户名密码的登陆方式,可是这个password值须要使用 verification_code字段的值来代替就行了。code

那又怎么将 verification_code的值替换password值返回给Spring Security呢?blog

咱们有一个UserServiceDetail类,实现了UserDetailsService接口,其中重载了方法:loadUserByUsername,Spring Security就是从这里拿到user表的password后进行比较判断的。那咱们修改这个方法,若是是验证码登陆方式,就把password属性设置成 verification_code的值,这样就欺骗了Spring Security,让它拿加密后的验证码去和password属性比较,若是相等也表示登陆成功了。具体代码以下:token

这种作法确实有点绕,也不是正规的作法,可是由于咱们对Spring Security这个流程有了必定程度的理解,就能够这么取巧来先达到目的,以后可能须要按正规的方式来作,所以不建议效仿,只是提供了另外一种一种思路而已。接口

 

原文地址:https://www.nndev.cn/archives/1882get

相关文章
相关标签/搜索