若依 Spring Security 短信,扫码登录

1.  修改  LoginBody,添加登录类型字段

@Data
public class LoginBody {/*** 用户名*/private String username;/*** 用户密码*/private String password;/*** 验证码*/private String code;/*** 唯一标识*/private String uuid;/*** 登录类型*/private String loginType;
}

2.定义一个常量

package com.ruoyi.common.core.domain.constant;/*** @author Ls* @date 2024/6/4*/
public class LoginTypeConstant {public static final String PASSWORD_LOGIN = "password";public static final String MOBILE_LOGIN = "mobile";public static final String QR_CODE_LOGIN = "qrCode";
}

3.修改登录接口

    @PostMapping("/login")public AjaxResult login(@RequestBody LoginBody loginBody) {AjaxResult ajax = AjaxResult.success();loginBody.setLoginType(LoginTypeConstant.MOBILE_LOGIN);// 生成令牌String token = loginService.login(loginBody);ajax.put(Constants.TOKEN, token);return ajax;}

4.重载登录实现类,基本不用改,loginbody 作为 credentials传入UsernamePasswordAuthenticationToken 

    public String login(LoginBody loginBody) {String username = loginBody.getUsername();
//        // 验证码校验
//        validateCaptcha(username, code, uuid);
//        // 登录前置校验
//        loginPreCheck(username, password);// 用户验证Authentication authentication = null;try {UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, loginBody);AuthenticationContextHolder.setContext(authenticationToken);// 该方法会去调用UserDetailsServiceImpl.loadUserByUsernameauthentication = authenticationManager.authenticate(authenticationToken);} catch (Exception e) {if (e instanceof BadCredentialsException) {AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));throw new UserPasswordNotMatchException();} else {AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage()));throw new ServiceException(e.getMessage());}} finally {AuthenticationContextHolder.clearContext();}AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));LoginUser loginUser = (LoginUser) authentication.getPrincipal();recordLoginInfo(loginUser.getUserId());// 生成tokenreturn tokenService.createToken(loginUser);}

5.自定义MyAuthenticationProvider类

package com.ruoyi.framework.security.mobile;import com.ruoyi.common.core.domain.constant.LoginTypeConstant;
import com.ruoyi.common.core.domain.model.LoginBody;
import com.ruoyi.common.exception.user.UserPasswordNotMatchException;
import com.ruoyi.framework.web.service.UserDetailsServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Component;/*** @author Ls* @date 2024/6/4*/
@Component
public class MyAuthenticationProvider implements AuthenticationProvider {@Autowiredprivate UserDetailsServiceImpl userDetailsService;@Autowiredprivate BCryptPasswordEncoder bCryptPasswordEncoder;@Overridepublic Authentication authenticate(Authentication authentication) throws AuthenticationException, UserPasswordNotMatchException {String name = authentication.getName();LoginBody loginBody = (LoginBody) authentication.getCredentials();String loginType = loginBody.getLoginType();UserDetails user;switch (loginType) {case LoginTypeConstant.PASSWORD_LOGIN:user = userDetailsService.loadUserByUsername(name);String password = loginBody.getPassword();String encoderPassword = bCryptPasswordEncoder.encode(password);// 数据库账号密码的校验能通过就通过if (bCryptPasswordEncoder.matches(password, user.getPassword())) {return new UsernamePasswordAuthenticationToken(user, encoderPassword);}case LoginTypeConstant.MOBILE_LOGIN:user = userDetailsService.loadUserByPhone(loginBody);return new UsernamePasswordAuthenticationToken(user, loginBody.getCode());case LoginTypeConstant.QR_CODE_LOGIN:break;default:break;}// 如果都登录不了,就返回异常输出throw new UserPasswordNotMatchException();}@Overridepublic boolean supports(Class<?> aClass) {return true;}
}

6.用户验证类新增手机号登录 UserDetailsServiceImpl 

public UserDetails loadUserByPhone(LoginBody loginBody) throws UsernameNotFoundException {// TODO: 2024/6/4  各种业务效验,这里图省事验证码放在passwordif (!Objects.equals(loginBody.getPassword(), "123456")) {throw new ServiceException("验证码错误");}//这里应该是根据手机号查询,我这里图省事直接拿账号登录String username = loginBody.getUsername();SysUser user = userService.selectUserByUserName(username);return createLoginUser(user);}

7.SecurityConfig调整,配置一下MyAuthenticationProvider

    /*** 自定义用户认证逻辑*/@Autowiredprivate MyAuthenticationProvider myAuthenticationProvider;/*** 身份认证接口*/@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.authenticationProvider(myAuthenticationProvider);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/24378.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

应对转租、混租、群租,天诚人脸物联网智能门锁与公租房管理系统有一套!

“住房”关系着老百姓的切身利益和幸福指数。近年来&#xff0c;全国各地掀起了保障性住房建设热潮&#xff0c;积极有序推进智慧公租房小区打造&#xff0c;助力共同富裕。 一、公租房入住对象界定 公租房的受众群体各地标准不一&#xff0c;却也大同小异。重庆市公共租赁房…

【安装笔记-20240607-Linux-在 OpenWrt-23.05 上安装配置域名服务器】

安装笔记-系列文章目录 安装笔记-20240607-Linux-在 OpenWrt-23.05 上安装配置域名服务器 文章目录 安装笔记-系列文章目录安装笔记-20240607-Linux-在 OpenWrt-23.05 上安装配置域名服务器 前言一、软件介绍名称&#xff1a;Bind9主页官方介绍 二、安装步骤测试版本&#xff…

Liunx环境下redis主从集群搭建(保姆级教学)01

Linux 环境安装redis 准备一台linux虚拟机 我使用基于Linux的开源类服务器操作系统CentOS7。 打开虚拟机&#xff0c;输入密码登录 下载linux版本的redis安装包 已经下载redis-5.0.10.tar.gz 创建一个文件夹用来安装redis,我在/opt目录下创建redis文件夹 将下载好的redis…

Windows 更新根文件夹的修改时间

简介&#xff1a; Win10 系统不会根据深层目录文件更新主目录的修改时间. 一般解决办法是关闭 Winodws 搜索引擎。 win10文件夹不能自动更新了怎么办&#xff1f;_百度知道 本脚本通过递归遍历子目录和子文件&#xff0c;来更新根目录的时间。 使用内层目录和当前目录下的最新…

【微信小程序】uni-app 配置网络请求

原因 由于平台的限制&#xff0c;小程序项目中 不支持axios&#xff0c;而且原生的&#xff0c;wx.request()API功能较为简单&#xff0c;不支持拦截器等全局定制的功能。因此&#xff0c;建议在uni-app项目中使用 escook/request-miniprogram 第三方包发起网络数据请求。 步…

Go go-redis应用

go-redis 是 Go 语言的一个流行的 Redis 客户端库&#xff0c;它提供了丰富的功能来与 Redis 数据库进行交互。 1、简单应用 package mainimport ("context""fmt""log""github.com/redis/go-redis/v9" )func main() {ctx : context…

接口幂等性设计(5 大方案罗列)

结合案例、列举场景的接口幂等性设计方案。 方案 1. 状态机 业务场景&#xff0c;数据审核成功后进行短信通知&#xff0c;或者是订单状态变成已支付后&#xff0c;短信通知用户订单生成的详细信息&#xff0c;等等和状态有关的操作。 假设 status&#xff1a;0&#xff08;待…

Python实战:计算向量夹角及相关系数

在Python中&#xff0c;我们可以使用NumPy库来计算向量之间的夹角&#xff08;通常是它们之间的余弦相似度&#xff09;以及皮尔逊相关系数&#xff08;Pearson correlation coefficient&#xff09;。下面是一个Python脚本&#xff0c;展示了如何执行这些计算。 首先&#xf…

查看服务器的硬件信息、操作系统等常用命令

在Linux下查看服务器是什么类型的服务器&#xff0c;通常可以通过查看服务器的硬件信息、操作系统和已安装的服务来判断。以下是一些常用的命令&#xff1a; 查看操作系统信息&#xff1a; cat /etc/*release* 查看CPU信息&#xff1a; lscpu 查看内存信息&#xff1a; free…

在npm发布自己的组件包

目录 前言 正文 npm和git的对比 Node环境的配置 具体发布步骤 ※※需要注意的是 尾声 &#x1f52d; Hi,I’m Pleasure1234&#x1f331; I’m currently learning Vue.js,SpringBoot,Computer Security and so on.&#x1f46f; I’m studying in University of Nottingham Ni…

轻松掌握Java循环:break、continue和return语句全解析

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

【iOS】MRC下的单例模式批量创建单例

单例模式的介绍和ARC下的单例请见这篇&#xff1a;【iOS】单例模式 目录 关闭ARC环境MRC下的单例ARC下的单例批量创建单例Demo 关闭ARC环境 首先关闭ARC环境&#xff0c;即打开MRC&#xff1a; 或是指定某特定目标文件为非ARC环境&#xff1a; 双击某个类文件&#xff0c;指定…

ERROR: cannot launch node of type [usb_cam/usb_cam_node]: usb_cam

sudo apt install ros-noetic-usb-cam 一般情况下之间下载就可以解决&#xff0c;如果显示无法定位到该文件 可以参考E: Unable to locate package ros-kinetic-usb-cam-CSDN博客 如果最后发现以下指令还是没办法运行那就是版本问题。 rqt_image_view 避雷&#xff01;&am…

「前端+鸿蒙」核心技术HTML5+CSS3(十一)

1、CSS3 简介 CSS3 是层叠样式表的最新标准,它引入了许多新特性来增强网页的表现力。CSS3 不仅增强了现有CSS属性的功能,还引入了新的布局方式、动画、渐变、阴影、边框效果等。 2、CSS3 长度单位 CSS3 引入了一些新的单位,包括但不限于: vw(视口宽度的百分比)vh(视口…

使用Colaboratory免费GPU资源微调Llama3-8b

Llama3微调过程 准备工作 Google Colaboratory Google Colaboratory&#xff0c;也称为 Colab&#xff0c;是一个基于云的平台&#xff0c;允许用户编写和执行 Python 代码。 它为机器学习和数据分析任务提供了便利的环境&#xff0c;并内置了对 TensorFlow 等流行库的支持。…

【推荐系统】CTR模型加了特征,用少量数据训test-AUC涨了,用大量数据训test-AUC跌了很多

先打印出train-AUC 加了特征 —> 如果train-AUC涨了 可以把测试集改为训练集&#xff0c;这样之后 如果test-AUC也涨了&#xff0c;说明测试代码是正常的&#xff0c;是模型过拟合 —> 减少MLP参数量 如果test-AUC还是跌了&#xff0c;说明测试代码有错&#xff0c;和…

pytorch使用DataParallel并行化保存和加载模型(单卡、多卡各种情况讲解)

话不多说&#xff0c;直接进入正题。 &#xff01;&#xff01;&#xff01;不过要注意一点&#xff0c;本文保存模型采用的都是只保存模型参数的情况&#xff0c;而不是保存整个模型的情况。一定要看清楚再用啊&#xff01; 1 单卡训练&#xff0c;单卡加载 #保存模型 torc…

!力扣70. 爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 1. 递归&#xff08;超时&#xff09; class Solution { public:int climbStairs(int n) {if(n1){return 1;}if(n2){return 2;}return climbStairs…

ARCGIS 几种SHP融合、拼接等方法

常用的工具可在Geoprocessing里面找到&#xff1a; Merge 使用该工具可将多个源中的数据集合并到新的单个输出数据集。所有输入数据集的类型必须相同。例如&#xff0c;点要素类之间可以合并&#xff0c;表之间也可以合并&#xff0c;但线要素类却无法同面要素类合并。 注意&…

1.vue2.x-初识及环境搭建

目录 1.下载nodejs v16.x 2.设置淘宝镜像源 3.安装脚手架 4.创建一个项目 5.项目修改 代码地址&#xff1a;source-code: 源码笔记 1.下载nodejs v16.x 下载地址&#xff1a;Node.js — Download Node.js 2.设置淘宝镜像源 npm config set registry https://registry.…