当前位置: 首页 > news >正文

ruoyi项目登录验证变更

背景:我用的是ruoyi-vue3.8.6版本,因公司需要使用window的域+用户进行登录验证,因此原有的ruoyi登录验证方法就得替换掉

1. 首先登录系统添加一些域账号,以确保登录方式更改后,能在sys_user中找到该账号,因还需要使用ruoyi系统的权限部门等表,因此是不能直接删除掉原本的表结构
2. 更改登录验证:
 2.1更改逻辑:
##更改之前的逻辑
SysLoginController.java中的login方法会调用SysLoginService的login方法生成token,
login方法中authenticationManager.authenticate(authenticationToken);会调用UserDetailsServiceImpl的loadUserByUsername进行自定义校验##思路
loadUserByUsername的validate方法会校验密码是否输入正确,但不仅仅于此,UserDetailsService的实现类有很多,因此就算直接修改了validate这个校验方法,依旧会被其他的实现类给校验失败,
最终决定剔除掉LoginUser loginUser = authentication.getPrincipal();的authentication相关调用方法,##实现后需要删除的代码并且执行下面的这些方法后,UserDetailsServiceImpl.java就可以删掉了,
configure(AuthenticationManagerBuilder auth)与bCryptPasswordEncoder方法也删除用不到加密了,SysLoginService.java中的关于UserDetailsService的引用也需要删除,
同时SecurityConfig.java中的关于UserDetailsService的引用也需要删除,
2.2 真正实现(根据账号密码自己写校验,然后生成LoginUser,以下就是具体实现:):
1. 原SysLoginController.login方法保持不动,里面的login调用更改为以下:public String login(String username, String password){  //这个方法几乎是彻底重写LoginUser loginUser = loadUserByUsername(username, password);AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));recordLoginInfo(loginUser.getUserId());return tokenService.createToken(loginUser);// 生成token}public LoginUser loadUserByUsername(String username, String password) throws UsernameNotFoundException {SysUser user = userService.selectUserByUserName(username);//数据库中获取这个账号信息if (StringUtils.isNull(user)){log.info("登录用户:{} 不存在.", username); //如果apo账号在系统中没有定义,那么就无法登录throw new ServiceException(MessageUtils.message("user.not.exists"));}else if (UserStatus.DELETED.getCode().equals(user.getDelFlag())){log.info("登录用户:{} 已被删除.", username);throw new ServiceException(MessageUtils.message("user.password.delete"));}else if (UserStatus.DISABLE.getCode().equals(user.getStatus())){log.info("登录用户:{} 已被停用.", username);throw new ServiceException(MessageUtils.message("user.blocked"));}passwordService.validate(username, password); //把校验成功后的密码赋值给user中,再返回,避免Spring Security再次使用PasswordEncoder加密进行判断return createLoginUser(user);}public LoginUser createLoginUser(SysUser user) {return new LoginUser(user.getUserId(), user.getDeptId(), user, permissionService.getMenuPermission(user));}2. 上面调用的passwordService.validate(username, password); 方法也需要重写校验部分,如下:public void validate(String username, String password){Integer retryCount = redisCache.getCacheObject(getCacheKey(username));retryCount = retryCount == null?0 : retryCount;if (retryCount >= maxRetryCount){AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL,MessageUtils.message("user.password.retry.limit.exceed", maxRetryCount, lockTime)));throw new UserPasswordRetryLimitExceedException(maxRetryCount, lockTime);}if (!loginAPO(username, password)) {retryCount = retryCount + 1;AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL,MessageUtils.message("user.password.retry.limit.count", retryCount)));redisCache.setCacheObject(getCacheKey(username), retryCount, lockTime, TimeUnit.MINUTES);throw new UserPasswordNotMatchException();}else{clearLoginRecordCache(username);}}3.上面的loginAPO校验方法:这个就是我们公司域账号登录校验方法public boolean loginAPO(String username, String passwd){Hashtable<String, String> HashEnv = new Hashtable<>();HashEnv.put(Context.SECURITY_AUTHENTICATION, "simple");HashEnv.put(Context.SECURITY_PRINCIPAL, "你们公司的域\\" + username);//必须有域,否则验证失败HashEnv.put(Context.SECURITY_CREDENTIALS, passwd);HashEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");HashEnv.put(Context.PROVIDER_URL,  "LDAP://xxx.xxx.xxx.xxx"); //域校验接口try {new InitialLdapContext(HashEnv, null);return true;} catch (Exception e) {return false; //这里也可以输出校验的错误信息}}

相关文章:

ruoyi项目登录验证变更

背景&#xff1a;我用的是ruoyi-vue3.8.6版本&#xff0c;因公司需要使用window的域用户进行登录验证&#xff0c;因此原有的ruoyi登录验证方法就得替换掉 1. 首先登录系统添加一些域账号&#xff0c;以确保登录方式更改后&#xff0c;能在sys_user中找到该账号&#xff0c;因…...

maven依赖冲突以及解决方法

什么是依赖冲突 依赖冲突是指项目依赖的某一个jar包&#xff0c;有多个不同的版本&#xff0c;因而造成类包版本冲突 依赖冲突的原因 依赖冲突很经常是类包之间的间接依赖引起的。每个显式声明的类包都会依赖于一些其它的隐式类包&#xff0c;这些隐式的类包会被maven间接引…...

K8S常用的一些命令及工具

已json格式输出 [rootk8master1 ~]# yum install epel-release [rootk8master1 ~]# yum -y install jq [rootk8master1 ~]# kubectl get --raw /api/v1/namespaces/dev | jq {"kind": "Namespace","apiVersion": "v1","metadata…...

Atlas 200I DK目标检测与追踪技术记录

数据集 数据集采用MOT系列&#xff0c;MOT是多目标追踪常用数据集&#xff0c;MOT数据集对数据集进行了分帧&#xff0c;如要获得视频&#xff0c;需要先利用opencv里的cv2.VideoWriter模块便利图片文件夹&#xff0c;具体代码如下&#xff1a; import os import cv2img_path…...

php如何在header增加key,sign,timestamp?怎么鉴权?

在PHP中&#xff0c;您可以通过在HTTP请求的Header中增加Key、Sign和Timestamp等信息来进行安全性鉴权。 以下是一种基本的思路和示例&#xff0c;用于说明如何实现这种鉴权机制&#xff1a; 生成Key和Sign&#xff1a; 服务端和客户端之间共享一个密钥&#xff08;Key&#x…...

从代码入手理解卡尔曼滤波器的原理之使用Eigen实现二维卡尔曼滤波器(七)

当然可以。现在,给定了矩阵和向量的具体定义,我们可以更详细地解释这些变量的意义,并确定卡尔曼滤波器的维度。 F (状态转移矩阵): F 是一个2x2的矩阵,给定为:1 0 0 1这意味着系统的状态从时刻t到t+1没有实质变化,即每个状态都保持不变。 H (观测矩阵): H 也是一个2x2的矩…...

文件的操作

前言&#xff1a;哈喽小伙伴们好久不见&#xff0c;国庆假期已经结束&#xff0c;接下来我们还是要马不停蹄的投入到学习当中&#xff0c;只有尽快调整状态回归学习&#xff0c;才能弯道超车。 今天我们一起来学习C语言——文件操作。 本篇文章讲到的所有函数均需要头文件#inc…...

left join时筛选条件对查询结果的

-- 创建表 CREATE TABLE table1 (id int(11) NOT NULL AUTO_INCREMENT,card_num varchar(60) DEFAULT NULL,customer_id varchar(60) DEFAULT NULL,PRIMARY KEY (id) ) ENGINE InnoDBAUTO_INCREMENT 12DEFAULT CHARSET utf8mb4 COMMENT 测试表1;-- 创建表 CREAT…...

CVE-2020-9483 apache skywalking SQL注入漏洞

漏洞概述 当使用H2 / MySQL / TiDB作为Apache SkyWalking存储时&#xff0c;通过GraphQL协议查询元数据时&#xff0c;存在SQL注入漏洞&#xff0c;该漏洞允许访问未指定的数据。 Apache SkyWalking 6.0.0到6.6.0、7.0.0 H2 / MySQL / TiDB存储实现不使用适当的方法来设置SQL参…...

PaddleX解决分类、检测两大场景问题?实战精讲教程来了!

AI技术加速数字化进程&#xff0c;从制造、交通、能源等基础行业&#xff0c;到医疗、城市、零售、家居等与人们日常生活息息相关的行业&#xff0c;AI技术推动了数字化变革&#xff0c;也不断赋能于千行百业&#xff0c;但产业落地实践中依然面临着数据、算法等诸多困难。为了…...

Hive用户中文使用手册系列(二)

命令和 CLI 语言手册命令 命令是 non-SQL statements&#xff0c;例如设置 property 或添加资源。它们可以在 HiveQL 脚本中使用&#xff0c;也可以直接在CLI或Beeline中使用。 命令描述退出使用 quit 或 exit 退出交互式 shell。重启将 configuration 重置为默认值(从 Hive…...

2023年中国清净剂行业需求现状及前景分析[图]

清净剂用于中和由于燃烧和润滑油氧化产生的酸性物质&#xff0c;并清除颗粒和污物。这类杂质在油中的溶解度有限&#xff0c;因此&#xff0c;清净剂可以最大程度减少沉积物的生成&#xff0c;降低污染&#xff0c;提高环保排放标准。成熟产品有磺酸盐、硫化烷基酚盐、烷基水杨…...

文心一言 VS 讯飞星火 VS chatgpt (115)-- 算法导论10.2 8题

八、用go语言&#xff0c;说明如何在每个元素仅使用一个指针 x.np(而不是通常的两个指针 next和prev)的下实现双向链表。假设所有指针的值都可视为 k 位的整型数&#xff0c;且定义x.npx.next XOR x.prev&#xff0c;即x.nert和x.prev 的 k 位异或。(NIL 的值用0表示。)注意要说…...

Redis的BitMap实现分布式布隆过滤器

布隆过滤器&#xff08;Bloom Filter&#xff09;是一种高效的概率型数据结构&#xff0c;用于判断一个元素是否属于一个集合。它通过使用哈希函数和位数组来存储和查询数据&#xff0c;具有较快的插入和查询速度&#xff0c;并且占用空间相对较少。 引入依赖 <!--切面--&…...

【linux API分析】module_init

linux版本&#xff1a;4.19 module_init()与module_exit()用于驱动的加载&#xff0c;分别是驱动的入口与退出函数 module_init()&#xff1a;内核启动时或动态插入模块时调用module_exit()&#xff1a;驱动移除时调用 本篇文章介绍module_init() module_init() module_init…...

NSDT孪生编辑器助力智慧城市

技术有能力改变城市的运作方式&#xff0c;提高效率&#xff0c;为游客和居民提供更好的体验&#xff0c;实现更可持续的运营和更好的决策。 当今城市面临的主要挑战是什么&#xff0c;成为智慧城市如何帮助克服这些挑战&#xff1f; 我们生活在一个日益城市化的世界&#xf…...

如何优雅的实现接口统一调用

耦合问题 有些时候我们在进行接口调用的时候&#xff0c;比如说一个push推送接口&#xff0c;有可能会涉及到不同渠道的推送&#xff0c;以我目前业务场景为例&#xff0c;我做结算后端服务的&#xff0c;会与金蝶财务系统进行交互&#xff0c;那么我结算后端会涉及到多个结算…...

tomcat、nginx实现四层转发+七层代理+动静分离实验

实验环境&#xff1a; nginx1——20.0.0.11——客户端 静态页面&#xff1a; nginx2——20.0.0.21——代理服务器1 nginx3——20.0.0.31——代理服务器2 动态页面&#xff1a; tomcat1——20.0.0.12——后端服务器1 tomcat2——20.0.0.22——后端服务器2 实验步骤&…...

交通目标检测-行人车辆检测流量计数 - 计算机竞赛

文章目录 0 前言1\. 目标检测概况1.1 什么是目标检测&#xff1f;1.2 发展阶段 2\. 行人检测2.1 行人检测简介2.2 行人检测技术难点2.3 行人检测实现效果2.4 关键代码-训练过程 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 毕业设计…...

Java Excel转PDF,支持xlsx和xls两种格式, itextpdf【即取即用】

Java Excel转PDF itextpdf&#xff0c;即取即用 工具方法一、使用方式1、本地转换2、网络下载 二、pom依赖引入三、工具方法三、引文 本篇主要为工具方法整理&#xff0c;参考学习其他博主文章做了整理&#xff0c;方便使用。 工具方法 一、使用方式 1、本地转换 导入依赖创…...

从一次数据解析Bug说起:彻底搞懂QString的toLocal8Bit、toUtf8和toLatin1该用哪个

从一次数据解析Bug说起&#xff1a;彻底搞懂QString的编码转换选择 上周排查一个网络协议解析问题时&#xff0c;遇到一个典型的编码陷阱&#xff1a;服务端返回的GBK编码数据包&#xff0c;在Qt客户端用toUtf8()解析后出现乱码。这个看似简单的编码问题背后&#xff0c;隐藏着…...

Windows HEIC缩略图终极解决方案:3步解锁苹果照片完美预览

Windows HEIC缩略图终极解决方案&#xff1a;3步解锁苹果照片完美预览 【免费下载链接】windows-heic-thumbnails Enable Windows Explorer to display thumbnails for HEIC/HEIF files 项目地址: https://gitcode.com/gh_mirrors/wi/windows-heic-thumbnails 还在为iPh…...

std::accumulate算法深度解析:从求和到通用折叠,解锁STL隐藏的瑞士军刀

1. 重新认识std::accumulate&#xff1a;不只是求和工具 第一次接触std::accumulate时&#xff0c;大多数人都是从求和开始的。确实&#xff0c;这个算法默认行为就是对范围内的元素进行累加。但如果你只把它当作一个高级计算器&#xff0c;那就太小看这个STL中的"瑞士军刀…...

RK3568开发板TB-96AI-3568CE深度评测:从核心接口到AI应用实战

1. 从芯片到板卡&#xff1a;TB-96AI-3568CE的设计哲学当一块芯片从图纸走向现实&#xff0c;成为一块可以握在手中的开发板时&#xff0c;这中间的路程远不止是简单的引脚引出和电源接通。我接触过不少基于RK3568的方案&#xff0c;但拿到贝启科技这块TB-96AI-3568CE时&#x…...

电力线路保护原理与整定计算实战解析:从电流、距离到差动保护

1. 项目概述&#xff1a;从“黑匣子”到“透明逻辑”在电力系统这个庞大而精密的网络中&#xff0c;输电线路如同人体的动脉血管&#xff0c;承担着输送能量的核心使命。然而&#xff0c;这条“动脉”时刻面临着雷击、外力破坏、绝缘老化、过负荷等各类风险的威胁。一旦发生故障…...

Linux存储管理:块设备与分区表的本质区别及实践指南

1. 项目概述&#xff1a;一次关于存储本质的深度对话“我不是表&#xff0c;我是块设备”——这个标题乍一看有点哲学意味&#xff0c;像是在为某个被误解的实体正名。在Linux的世界里&#xff0c;这恰恰揭示了存储管理中一个最核心、也最容易被混淆的概念关系&#xff1a;分区…...

程序员转行方向推荐:程序员转行新风口!掌握AI大模型,高薪就业不是梦!

本文为程序员提供转行方向建议&#xff0c;涵盖数据分析师、人工智能工程师、AI大模型和产品经理等职业&#xff0c;分析其推荐理由及技能要求。特别强调AI大模型的发展趋势和人才需求&#xff0c;提供系统化学习资源和进阶路线图&#xff0c;帮助程序员在AI时代提升竞争力&…...

发现安卓应用宝库:APKMirror客户端让你安全下载任何版本应用

发现安卓应用宝库&#xff1a;APKMirror客户端让你安全下载任何版本应用 【免费下载链接】APKMirror 项目地址: https://gitcode.com/gh_mirrors/ap/APKMirror 还记得上次为了找一个旧版本的微信&#xff0c;在各种论坛里翻来覆去地找&#xff0c;最后下载的APK文件还让…...

别再死磕GAN了!用PyTorch从零实现DDPM扩散模型,手把手带你跑通CIFAR-10生成

从GAN到DDPM&#xff1a;用PyTorch实战扩散模型的图像生成革命 当我在2022年第一次看到DALLE 2生成的超现实图像时&#xff0c;作为一名长期使用GAN的开发者&#xff0c;我意识到生成式AI正在经历一场静默的革命。传统GAN虽然能生成惊艳的结果&#xff0c;但其训练过程就像在钢…...

移动端测试实战:App兼容性测试的全套解决方案

一、移动端App兼容性测试的核心价值与挑战在移动互联网生态中&#xff0c;设备碎片化、系统版本迭代加速、网络环境多样性等因素&#xff0c;使得App兼容性问题成为影响用户体验与产品口碑的关键变量。据行业数据统计&#xff0c;兼容性问题引发的用户投诉占比超过30%&#xff…...