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. Docker:架构分解

    17分钟快速浏览一遍 Docker内部构建 要理解Docker内部构建,需要理解以下三种部件: Docker镜像(Image) Docker容器(Container) Docker仓库(reposit ...

  2. IMAGE_OPTIONAL_HEADER32 结构作用

    IMAGE_OPTIONAL_HEADER32 结构作用 接 着我们来谈谈 IMAGE_OPTIONAL_HEADER 结构,正如名字的意思,这是一个可选映像头,是一个可选的结构,但是呢,实际上上节课 ...

  3. 转 C++拷贝构造函数详解

    C++拷贝构造函数详解 一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a = 100; int b = a; 而类对象与普通对象不同,类对象内部结构一 ...

  4. Python学习杂记_6_字典常用操作

    字典操作 字典是由一对花括号括起来的一组“键值对”,每个键值对就是字典的一个元素,元素在字典中是无序的,常见操作如下: info = { 'name':'xiaoming', 'sex':'nan', ...

  5. golang xorm MSSQL where查询案例

    xorm官方中文文档 参考 http://xorm.io/docs/ 以sqlserver为例 先初始化连接等... engine, err := xorm.NewEngine("mssql ...

  6. LeetCode OJ--Palindrome Partitioning **

    https://oj.leetcode.com/problems/palindrome-partitioning/ 给定一个字符串 s,求所有的子串组合,每个子串都是回文的. 比如,aba: {a,b ...

  7. HDU 5131.Song Jiang's rank list (2014ACM/ICPC亚洲区广州站-重现赛)

    Song Jiang's rank list Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java ...

  8. UVA 11100 The Trip, 2007 水题一枚

    题目链接:UVA - 11100 题意描述:n个旅行箱,形状相同,尺寸不同,尺寸小的可以放在尺寸大的旅行箱里.现在要求露在最外面的旅行箱的数量最少的同时满足一个旅行箱里放的旅行箱的数量最少.求出这样满 ...

  9. 3)nginx的启动与停止、重启,linux配置对外端口

    [启动] 启动代码格式:nginx安装目录地址 -c nginx配置文件地址例如: [root@LinuxServer sbin]# /usr/local/nginx/sbin/nginx -c /u ...

  10. XCode设置竖屏

    选中你的项目,在General这个标签内,Deoployment info的这个分组,有一个Device Orientation 标签,内有一个Portrait的选项,选中是竖屏,取消选中是横屏