ruoyi 若依框架采用第三方登录
在项目中,前后端分离的若依项目,需要通过统一认证,或者是第三方协带认证信息跳转到本系统的指定页面。需要前后端都做相应的改造,由于第一次实现时已过了很久,再次重写时,发现还是搞了很长时间,所以花点时间整理出事,也方便给大家参考。
首先明确需要处理几个部分:
一、后端的处理
1、 在控制器层,SysLoginController 中,原有的login方法之后,写一个登录的方法,注意其中的 loginService.logingcy(userId); 这个是下一步要实现的。通过第三方协议解析出用户的信息,可能 是工号,或者是微信的openid这都无所谓,反正通过他你能找到本系统的用户就可以了。

@GetMapping("/logingcy")public AjaxResult logingcy(String ssouser){AjaxResult ajax = AjaxResult.success();try {//通过中间的协议解析出用户的基本信息String[] userInfo = JasmineSsoUtil.getUserInfo(ssouser, Constants.SSODOMAIN, Constants.SSOKEY);String userId = userInfo[0];//以下为获取此员工的待办工单数量,并按要求返回值System.out.println("useris "+userId);String token = loginService.logingcy(userId);ajax.put(Constants.TOKEN, token);return ajax;} catch (Exception e) {e.printStackTrace();}return AjaxResult.error();// 生成令牌}
2、在登录服务中增加一个和原来登录对应的方法 SysLoginService loginService.logingcy(userId);
/*通过工程翼用户登录*/public String logingcy(String username){// 用户验证Authentication authentication = null;SysUser sysUser = userService.selectUserByUserName(username);System.out.println("admin staffcode is "+ username +" and password is "+sysUser.getPassword());try{//已经确认解析出用户信息,所以这里使用一个内部的特定密码和模拟密码进行检验userDetailsService.loadUserByUsername(username);UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, Constants.CPASSWORD);//AuthenticationContextHolder.setContext(token);// 该方法会去调用UserDetailsServiceImpl.loadUserByUsernameauthentication = authenticationManager.authenticate(token);}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();// 生成tokenreturn tokenService.createToken(loginUser);}
3、增加一个 SecurityProvider 用于密码和校检

具体的代码如下:
package com.ruoyi.framework.security.provider;import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.exception.user.UserPasswordNotMatchException;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.system.service.ISysUserService;
import org.apache.poi.hssf.record.DVALRecord;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.*;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;/*** 自定义认证服务* */
@Service("securityProvider")
public class SecurityProvider implements AuthenticationProvider {@Autowiredprivate BCryptPasswordEncoder bCryptPasswordEncoder;@Autowiredprivate UserDetailsService userDetailsService;@Autowiredprivate ISysUserService userService;public SecurityProvider(UserDetailsService userDetailsService) {this.userDetailsService = userDetailsService;}@Overridepublic Authentication authenticate(Authentication authentication) throws AuthenticationException {/* UsernamePasswordAuthenticationToken token= (UsernamePasswordAuthenticationToken) authentication;*/String name = authentication.getName();String password = (String) authentication.getCredentials();System.out.println("name:"+name+"password:"+password);//这里直接判断异常UserDetails user = userDetailsService.loadUserByUsername(name);String encoderPassword = bCryptPasswordEncoder.encode(password);SysUser user1 = userService.selectUserByUserName("admin");user1.setPassword(SecurityUtils.encryptPassword("admin123"));userService.updateUser(user1);System.out.println("1password is "+ SecurityUtils.encryptPassword(password));System.out.println("2password is"+encoderPassword);System.out.println("user passwordis "+user.getPassword());// 数据库账号密码的校验能通过就通过if (SecurityUtils.matchesPassword(password, user.getPassword())){// if (bCryptPasswordEncoder.matches(password, user.getPassword())) {// log.info("使用账户密码登录");return new UsernamePasswordAuthenticationToken(user, encoderPassword);}//这里是第三方登录的使用方式,用一个内部的密码代替了password的位置// log.info(""+checkValid);if(Constants.CPASSWORD.equalsIgnoreCase(password)){return new UsernamePasswordAuthenticationToken(user, password);} else {// 如果都登录不了,就返回异常输出throw new UserPasswordNotMatchException();}}@Overridepublic boolean supports(Class<?> authentication) {//返回true后才会执行上面的authenticate方法,这步能确保authentication能正确转换类型return true;}}
4、修改配置文件 SecurityConfig 有两处需要修改,一个是最下面,使用上一步定义的SecurityProvider
一个是上面,允许前端的新登录页面可以直接访问

到此,后端部分的改造就完成了。
二、前端页面
1、首先要做一个登录过度页面,内容可以为空白,只需要接收地址栏中的参数,并且调用上面第一步中定义的方法
2、在路由中配置路径对应访问的这个页面

3、设置白名单,可以直接访问页面

4、在原来的login.js中写入后台对应的地址,这里注意需要先logou一下,防止重复登录报错
export function logingcy(ssouser) {logout();return request({url: '/logingcy?ssouser=' + ssouser,method: 'get',})
}
5、在user.js中增加一个action,这里需要写入token是关键,不然后台一直报未登录

相关文章:
ruoyi 若依框架采用第三方登录
在项目中,前后端分离的若依项目,需要通过统一认证,或者是第三方协带认证信息跳转到本系统的指定页面。需要前后端都做相应的改造,由于第一次实现时已过了很久,再次重写时,发现还是搞了很长时间,…...
dom api
dom的全称为Document Object Model,即文档对象模型.所谓文档就是html页面,对象就是js里的对象,通过这个模型把页面上的元素和js里的对象关联起来. 下面是关于dom api的一些常用方法 1.获取元素 使用querySelector()方法获取一个元素 使用querySelectorAll()方法获取所有元素 当…...
音视频项目—基于FFmpeg和SDL的音视频播放器解析(二十一)
介绍 在本系列,我打算花大篇幅讲解我的 gitee 项目音视频播放器,在这个项目,您可以学到音视频解封装,解码,SDL渲染相关的知识。您对源代码感兴趣的话,请查看基于FFmpeg和SDL的音视频播放器 如果您不理解本…...
Qt项目打包发布超详细教程
https://blog.csdn.net/qq_45491628/article/details/129091320...
简单递归题
本来不想用递归做的,最后还是用了 题目如下: 洪尼玛有 n 块长度不同的木板,他想用这些木板拼成一个等边三角形的围栏,好将他的草泥马养在这个围栏里面。现在,给你这 n 块木板的长度,洪尼玛想知道他能否拼…...
再生式收音机踩坑记
下载《A Simple Regen Radio for Beginners》这篇文章也有好几年了,一直没有动手,上周末抽空做了一个,结果相当令人沮丧,一个台也收不到,用示波器测量三极管振荡波形,只有在调节再生电位器R2过程中…...
稻谷飘香金融助力——建行江门市分行助力乡村振兴
7月的台山,稻谷飘香。在大耕户李胜业的农田里,金灿灿的稻谷翻起层层稻浪,收割机在稻浪里来回穿梭,割稻、脱粒、装车等工序一气呵成。空气中弥漫着丰收的喜悦。 夏粮迎丰收的背后,是中国建设银行江门市分行(…...
【Pytorch】Visualization of Feature Maps(1)
学习参考来自 CNN可视化Convolutional Featureshttps://github.com/wmn7/ML_Practice/blob/master/2019_05_27/filter_visualizer.ipynb 文章目录 filter 的激活值 filter 的激活值 原理:找一张图片,使得某个 layer 的 filter 的激活值最大,…...
js修改浏览器地址栏里url的方法
1、更新url某一参数的值 function updateQueryStringParameter(uri, key, value) {if (!value) { return uri }var re new RegExp("([?&])" key ".*?(&|$)", "i");var separator uri.indexOf(?) ! -1 ? "&" : &q…...
正则表达式(Java)(韩顺平笔记)
正则表达式(Java) 底层实现 package com.hspedu.RegExp;import java.util.regex.Matcher; import java.util.regex.Pattern;public class RegExp00 {public static void main(String[] args) {String content "1998年12月8日,第二代J…...
LLVM学习笔记(62)
4.4.3.3.2. 指令处理的设置 4.4.3.3.2.1. 目标机器相关设置 除了基类以外,X86TargetLowering构造函数本身也是一个庞然大物,我们必须要分段来看。V7.0做了不小的改动,改进了代码的结构,修改了一些指令的设置。 100 X86Targ…...
解决Spring Boot应用在Kubernetes上健康检查接口返回OUT_OF_SERVICE的问题
现象 在将Spring Boot应用部署到Kubernetes上时,健康检查接口/healthcheck返回的状态为{"status":"OUT_OF_SERVICE","groups":["liveness","readiness"]},而期望的是返回正常的健康状态。值得注意的…...
Java对象逃逸
关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 未经允许不得转载 目录 一、导读二、概览三、相关知识3.1 逃逸…...
Greenplum的数据库年龄检查处理
概述 Greenplum是基于Postgresql数据库的分布式数据库,而PG数据库在事务及多版本并发控制的实现方式上很特别,采用的是递增事务id的方法,事务id大的事务,认为比较新,反之事务id小,认为比较旧。 事务id的上…...
[HCIE] IPSec-VPN (IKE自动模式)
概念: IKE:因特网密钥交换 实验目标:pc1与pc2互通 步骤1:R1与R3配置默认路由 R1: ip route-static 0.0.0.0 0.0.0.0 12.1.1.2 R2: ip route-static 0.0.0.0 0.0.0.0 23.1.1.2 步骤2:配ACL…...
Qt/QML编程学习之心得:一个Qt工程的学习笔记(九)
这里是关于如何使用Qt Widget开发,而Qt Quick/QML的开发是另一种方式。 1、.pro文件 加CONFIG += c++11,才可以使用Lamda表达式(一般用于connect的内嵌槽函数) 2、QWidget 这是Qt新增加的一个类,基类,窗口类,QMainWindow和QDialog都继承与它。 3、Main函数 QApplicati…...
c++ 课程笔记
105课: cpp文件分为 .h .cpp .cpp 文件 110课:124课 深拷贝 浅拷贝 自建拷贝构造解决浅拷贝释放new后堆区析构函数的问题 (浅拷贝 拷贝内存地址, 释放堆区时 导致源数据 释放时,该地址无数据?而报错) 浅拷贝: 拷贝了对方的值和 堆区内存地址(删除 影响原数据堆区) 深拷贝…...
ELK企业级日志分析平台——ES集群监控
启用xpack认证 官网:https://www.elastic.co/guide/en/elasticsearch/reference/7.6/configuring-tls.html#node-certificates 在elk1上生成证书 [rootelk1 ~]# cd /usr/share/elasticsearch/[rootelk1 elasticsearch]# bin/elasticsearch-certutil ca[rootelk1 ela…...
Twincat使用:EtherCAT通信扫描硬件设备链接PLC变量
EtherCAT通信采用主从架构,其中一个主站设备负责整个EtherCAT网络的管理和控制,而从站设备则负责在数据环网上传递数据。 主站设备可以是计算机、工控机、PLC等, 而从站设备可以是传感器、执行器、驱动器等。 EL3102:MDP5001_300_CF8D1684;…...
手机APP-MCP走蓝牙无线遥控智能安全帽~执法记录仪~拍照录像,并可做基础的配置,例如修改服务器IP以及配置WiFi等
手机APP-MCP走蓝牙无线遥控智能安全帽~执法记录仪~拍照录像,并可做基础的配置,例如修改服务器IP以及配置WiFi等 手机APP-MCP走蓝牙无线遥控智能安全帽~执法记录仪~拍照录像,并可做基础的配置,例如修改服务器IP以及配置WiFi等, AIoT万物智联,智能安全帽…...
使用Dify.AI快速搭建DeOldify图像上色AI Agent
使用Dify.AI快速搭建DeOldify图像上色AI Agent 你有没有翻出过家里的老照片?那些黑白或泛黄的影像,承载着珍贵的记忆,但总让人觉得少了点色彩和温度。过去,给老照片上色是个技术活,要么自己学复杂的修图软件ÿ…...
别再为y+发愁了!Fluent新手必看:不同湍流模型的近壁面处理到底怎么选?
Fluent湍流模型近壁面处理实战指南:从理论到一键配置 在计算流体力学(CFD)领域,湍流模拟的准确性很大程度上取决于近壁面处理的正确选择。许多Fluent初学者在面对Standard Wall Functions、Enhanced Wall Treatment、Menter-Lechner等选项时,…...
C 盘突然爆满?一次彻底排查与迁移实战:从仅剩 12GB 到释放到 46GB
前言很多人都有一个误区: “软件安装到了 D 盘,C 盘就不会继续变大。”我之前也是这么认为的。 结果实际使用一段时间后,C 盘空间还是一路被吃掉,最后只剩下 12GB 左右,已经开始明显影响系统流畅度和开发环境使用。这次…...
别再手动配环境了!用CMake+VS2022一键搞定PCL点云库(附完整项目模板)
现代C点云开发实战:基于CMake与VS2022的PCL高效配置指南 点云处理已成为计算机视觉、自动驾驶和三维重建领域的核心技术之一。对于C开发者而言,Point Cloud Library (PCL)提供了强大的工具集,但传统的配置方式往往令人望而生畏——手动设置包…...
Flux2-Klein-9B-True-V2部署教程:tail -f实时监控日志定位加载异常
Flux2-Klein-9B-True-V2部署教程:tail -f实时监控日志定位加载异常 1. 项目概述 Flux2-Klein-9B-True-V2是基于官方FLUX.2 [klein] 9B改进的文生图/图生图模型,具备强大的图像生成和编辑能力。这个模型特别适合需要高质量图像生成的场景,从…...
Keras性能优化秘籍:20个专业技巧加速模型训练流程
Keras性能优化秘籍:20个专业技巧加速模型训练流程 【免费下载链接】keras Deep Learning for humans 项目地址: https://gitcode.com/GitHub_Trending/ke/keras Keras作为"Deep Learning for humans"的热门框架,其简洁的API设计让深度学…...
从TOPS到实际吞吐量:解码AI芯片推理效率的四大关键指标
1. 为什么TOPS不能代表真实性能? 第一次接触AI芯片选型时,我也被厂商宣传的TOPS数值唬住了——直到实际部署时才发现,标称100TOPS的芯片跑ResNet-50的吞吐量还不如另一款40TOPS的芯片。这种"纸面算力"和"实际吞吐量"的落…...
SAP AVC实战:从MTO订单到交付的可配置物料全链路解析
1. 可配置物料的前世今生:从LO-VC到AVC的进化之路 第一次接触可配置物料是在2015年,当时客户需要定制一批液压系统,每个订单的参数都不同。传统做法是给每个变体创建独立物料号,结果一个月下来物料主数据暴涨300%,MRP跑…...
别再拍脑袋估工时了!手把手教你用FPA功能点分析法,给软件项目算笔明白账
告别拍脑袋估算:FPA功能点分析法实战指南 估算软件项目工作量时,你是否也经历过这样的场景?老板或客户拿着模糊的需求文档问:"这个功能多久能做完?"你心里没底,只能硬着头皮给出一个数字…...
用Logisim复刻华科计算机硬件课:从8位加减法器到32位ALU的保姆级搭建实录
用Logisim复刻华科计算机硬件课:从8位加减法器到32位ALU的保姆级搭建实录 记得第一次打开Logisim时,面对空白的画布和密密麻麻的逻辑门元件,我完全不知道从何下手。作为华科《计算机硬件系统设计》课程的必修实验,运算器搭建这个…...
