内容简介:Spring Security默认的一个实现是使用用户名密码登录,当初我们在开始做项目时,也是先使用这种登录方式,并没有多考虑其他的登录方式。而后面需求越来越多,我们需要支持短信验证码登录了,这时候再看了解Spring Security中如何实现短信验证码登录。这里有一篇文章:我们知道默认的方式是,数据库里的user表保存了username和password,其中后者是密文保存。当用户登录时,Spring Security会拿用户传过来的密码进行加密后和数据库中password的值进行比较,相同则登录成功。
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的校验就好了。这样一来,实现的逻辑如下:
在user表中添加一个字段verification_code,等用户获取手机验证码时,后端将返回给用户的验证码进行加密,加密方式和对password的处理一样,然后保存到 verification_code 字段中。然后用户在输入手机号和验证码登录时,我们根据手机号获取用户的username,然后将username和验证码传给获取token的接口,让这个接口以为我们使用的是用户名密码的登录方式,但是这个password值需要使用 verification_code字段的值来代替就好了。
那又怎么将 verification_code的值替换password值返回给Spring Security呢?
我们有一个UserServiceDetail类,实现了UserDetailsService接口,其中重载了方法:loadUserByUsername,Spring Security就是从这里拿到user表的password后进行比较判断的。那我们修改这个方法,如果是验证码登录方式,就把password属性设置成 verification_code的值,这样就欺骗了Spring Security,让它拿加密后的验证码去和password属性比较,如果相等也表示登录成功了。具体代码如下:
这种做法确实有点绕,也不是正规的做法,但是因为我们对Spring Security这个流程有了一定程度的理解,就可以这么取巧来先达到目的,之后可能需要按正规的方式来做,因此不建议效仿,只是提供了另一种一种思路而已。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Django实现小程序的登录验证功能,并维护登录态
- Vue中的验证登录状态
- iOS 登录时验证手机号和倒计时发送验证码问题
- django与小程序实现登录验证功能
- 实现基于JWT的Token登录验证功能
- springboot + shiro 验证码与记住登录
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
You Can Program in C++
Francis Glassborow / John Wiley & Sons / 2006-7 / 406.80元
An interactive and fun way to learn C++, one of the most popular high-level programming languages for graphic applications This unique, hands-on approach to learning C++ makes t......一起来看看 《You Can Program in C++》 这本书的介绍吧!