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这个流程有了一定程度的理解,就可以这么取巧来先达到目的,之后可能需要按正规的方式来做,因此不建议效仿,只是提供了另一种一种思路而已。

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

Spring Security实现短信验证码登录的更多相关文章

  1. SpringBoot + Spring Security 学习笔记(五)实现短信验证码+登录功能

    在 Spring Security 中基于表单的认证模式,默认就是密码帐号登录认证,那么对于短信验证码+登录的方式,Spring Security 没有现成的接口可以使用,所以需要自己的封装一个类似的 ...

  2. Spring Security构建Rest服务-1203-Spring Security OAuth开发APP认证框架之短信验证码登录

    浏览器模式下验证码存储策略 浏览器模式下,生成的短信验证码或者图形验证码是存在session里的,用户接收到验证码后携带过来做校验. APP模式下验证码存储策略 在app场景下里是没有cookie信息 ...

  3. springboot +spring security4 自定义手机号码+短信验证码登录

    spring security 默认登录方式都是用户名+密码登录,项目中使用手机+ 短信验证码登录, 没办法,只能实现修改: 需要修改的地方: 1 .自定义 AuthenticationProvide ...

  4. Spring Security之短信登录

    实现短信验证码登录 前面实现了 用户名+密码 的登录方式,现在实现一下短信验证码登录. 开发短信验证码接口 短信验证码和图形验证码类似,用户从手机短信得到验证码和从图片得到验证码类似. 校验短信验证码 ...

  5. wepy 实现 用户名登录与短信验证码登录

    wepy 实现 用户名登录与短信验证码登录

  6. SpringCloud微服务实战——搭建企业级开发框架(二十六):自定义扩展OAuth2实现短信验证码登录

    现在手机验证码登录似乎是每个网站必备的功能,OAuth2支持扩展自定义授权模式,前面介绍了如何在系统集成短信通知服务,这里我们进行OAuth2的授权模式自定义扩展,使系统支持短信验证码登录. 1.在g ...

  7. python+pymssql+selenium 获取短信验证码登录(实战练习)

    登录页面输入手机号, 获取短信验证码(验证码有10分钟有效期) 1 连接sql server数据库,获取10分钟之内的有效短信验证码 2 页面输入手机号,并获取验证码.若存在有效验证码则输入验证码,若 ...

  8. vue实现短信验证码登录

    无论是移动端还是pc端登录或者注册界面都会见到手机验证码登录这个功能,输入手机号,得到验证码,最后先服务器发送请求,保存登录的信息,一个必不可少的功能 思路 1,先判断手机号和验证是否为空, 2,点击 ...

  9. 简单说说Spring Security 使用(附加验证码登录,自定义认证)

    先看官方文档:http://docs.spring.io/spring-security/site/docs/4.0.x/reference/htmlsingle/ spring security4已 ...

随机推荐

  1. Intelli IDEA快捷键(配合IdeaVim)

    Intelli IDEA开发环境,个人总结的一些常用的快捷键. 想要使用vim方式编辑代码,可以使用Intelli IDEA的IdeaVim.IdeaVim插件功能很强大,在vim编辑模式下还可以使用 ...

  2. 洛谷 P1038 神经网络

    题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神经网络的研究一直是当今 ...

  3. FOR XML PATH 语句的应用【所有列值显示在一行中】

    原文发布时间为:2010-10-20 -- 来源于本人的百度文章 [由搬家工具导入] 大家都知道在SQL Server中利用 FOR XML PATH 语句能够把查询的数据生成XML数据,下面是它的一 ...

  4. 用IHTMLDocument2接口获取页面上想要的数据,代替正则表达式

    原文发布时间为:2010-07-01 -- 来源于本人的百度文章 [由搬家工具导入] 1. 用 IHTMLDocument2::all 获得所有元素; 2. 用 IHTMLElementCollect ...

  5. EasySlider-最简洁的JQuery滚动插件 可控制滚动

    原文发布时间为:2010-05-05 -- 来源于本人的百度文章 [由搬家工具导入] Easy Silder是由Alen Grakalic开发的基于JQuery的滚动插件,它支持以下功能: 1.自动滚 ...

  6. ckeditor与ckfinder的使用方法 .NET (转载)

    原文发布时间为:2009-11-25 -- 来源于本人的百度文章 [由搬家工具导入] ckeditor与ckfinder的使用方法 .NET (转载) ckeditor 3.0.1学习笔记  一.ck ...

  7. duilib入门简明教程 -- 界面布局(9) (转)

    原文转自:http://www.cnblogs.com/Alberl/p/3343806.html     上一个教程实现的标题栏代码中,并没有看到处理自适应窗口大小的代码,但是窗口大小变化后,按钮的 ...

  8. hdu 4522(图论,构图)

    湫湫系列故事——过年回家 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

  9. function in Postgres

    CREATE or REPLACE FUNCTION fn_attr_category() RETURNS void AS $BODY$ declare v_tmp_rec record; begin ...

  10. nfc是什么?nfc功能是什么?

    http://android.tgbus.com/lab/software/201208/447420.shtml nfc是什么?nfc功能是什么?出现在我们手机上的nfc功能怎么用?下面请看今天小编 ...