c.p.api.config.MyAuthenticationProvider

文章目录

  • 1、URL
  • 1、AdminController
  • 3、AuthenticationProvider

2025-01-15 14:21:31.017  
WARN 1972 --- [nio-8087-exec-8] 
c.p.api.config.MyAuthenticationProvider  
: 管理员:13524972741 登录失败:密码错误

解释:

  • 时间戳: 2025-01-15 14:21:31.017 - 表示日志记录的时间。
  • 日志级别: WARN - 表示这是一个警告级别的日志。
  • 进程ID: 1972 - 表示发出日志的 Java 进程 ID。
  • 线程信息: [nio-8087-exec-8] - 表示执行日志记录的线程。
  • 类名: c.p.api.config.MyAuthenticationProvider - 表示发出日志的类的完整路径。
  • 日志消息: 管理员:13524972741 登录失败:密码错误 - 表示具体的错误信息,管理员的用户名(这里是电话号码)登录失败,原因是密码错误。

格式化的目的:

通过换行,使得每部分信息都更加清晰独立,更容易阅读和理解。

1、URL

 http://127.0.0.1:8087/admin/signIn?username=???&password=???
{"code": 1,"msg": "用户名或密码错误"
}

1、AdminController

@Api(description = "后台用户管理")
@RestController
@RequestMapping("admin")
public class AdminController {@PostMapping("signIn")@ApiOperation("管理员账号密码登录swagger")@PassTokenpublic BaseResult signIn(@RequestParam("username") String username,@RequestParam("password") String password) {return BaseResult.success();}
}
  • 我们发现signIn方法中没有任何逻辑,说明逻辑可能在 Spring Security 配置 中

3、AuthenticationProvider

package com.productQualification.api.config;import com.productQualification.user.domain.Admin;
import com.productQualification.user.domain.Role;
import com.productQualification.user.service.AdminCacheService;
import com.productQualification.user.service.RoleCacheService;
import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.stereotype.Component;import java.util.*;@Component
public class MyAuthenticationProvider implements AuthenticationProvider {private static Map<String, Date> login = new HashMap<>();private static final int LOGIN_INTERVAL = 5;//最小登录间隔private final Logger logger = LoggerFactory.getLogger(getClass());private final Logger loggerAdmin = LoggerFactory.getLogger("ADMIN");@Autowiredprivate AdminCacheService adminCacheService;@Autowiredprivate RoleCacheService roleCacheService;@Overridepublic Authentication authenticate(Authentication authentication) throws AuthenticationException {// 获取用户登录时输入的用户名String username = authentication.getName();checkLoginInterval(username);// 根据用户名查询系统中的用户信息Admin admin = adminCacheService.findByUsername(username);// 如果用户列表为 null,说明查找用户功能出现异常,抛出 AuthenticationServiceExceptionif (null == admin) {logger.warn("管理员:{} 登录失败:用户名错误", username);throw new BadCredentialsException("用户名或密码错误");}// 锁定状态if (Admin.LOCKED_BY_PASSWORD.equals(admin.getStatus())) {if (new Date().after(DateUtils.addHours(admin.getLockedDate(), 24))) {//超过24小时自动解锁admin.setStatus(Admin.NORMAL_STATUS);admin.setPasswordAttemptCount(0);admin.setLockedDate(null);adminCacheService.save(admin);} else {logger.warn("管理员:{} 登录 登录失败:用户密码尝试次数过多 ", username);throw new BadCredentialsException("用户密码尝试次数过多,请24小时后再尝试,或找领导解锁");}}if (Admin.LOCKED_BY_LEADER.equals(admin.getStatus())) {logger.warn("管理员:{} 登录 登录失败:用户已被上级锁定", username);throw new BadCredentialsException("用户已被上级锁定");}// 密码对比String password = (String) authentication.getCredentials();if (admin.passwordUnMatches(password)) {admin.setPasswordAttemptCount(admin.getPasswordAttemptCount() + 1);if (admin.getPasswordAttemptCount() > Admin.PASSWORD_ATTEMPT_MAX_COUNT) {//密码尝试超过上限admin.setStatus(Admin.LOCKED_BY_PASSWORD);admin.setLockedDate(new Date());adminCacheService.save(admin);logger.warn("管理员:{} 登录 登录失败:用户密码尝试次数过多", username);throw new BadCredentialsException("用户密码尝试次数过多,请24小时后再尝试,或找领导解锁");}adminCacheService.save(admin);logger.warn("管理员:{} 登录失败:密码错误", username);throw new BadCredentialsException("用户名或密码错误");}List<GrantedAuthority> authorities = new ArrayList<>();List<Role> roles = roleCacheService.findRolesByAdminId(admin.getId());for (Role role : roles) {authorities.add(new SimpleGrantedAuthority(role.getName()));}return new UsernamePasswordAuthenticationToken(authentication, authentication.getCredentials(), authorities);}private void checkLoginInterval(String username) {Date lastLoginDate = login.get(username);if (null == lastLoginDate) {login.put(username, new Date());return;}if ((System.currentTimeMillis() - lastLoginDate.getTime())/1000 < LOGIN_INTERVAL) {throw new BadCredentialsException("登录频率过高");} else {login.put(username, new Date());}}@Overridepublic boolean supports(Class<?> authentication) {return true;}
}

在这里插入图片描述

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

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

相关文章

C++ 模拟真人鼠标轨迹算法 - 防止游戏检测

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序&#xff0c;它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言&#xff0c;原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势&#xff1a; 模拟…

设置 Git 默认推送不需要输入账号和密码【Ubuntu、SSH】

如何设置 Git 默认推送不需要输入账号和密码 在使用 Git 管理代码时&#xff0c;许多开发者会遇到每次推送&#xff08;push&#xff09;或拉取&#xff08;fetch&#xff09;代码时都需要输入 GitHub 或 GitLab 等远程仓库的账号和密码的情况。虽然设置了用户名和电子邮件信息…

【ArcGIS微课1000例】0140:总览(鹰眼)、放大镜、查看器的用法

文章目录 一、总览工具二、放大镜工具三、查看器工具ArcGIS中提供了三种局部查看的工具: 总览(鹰眼)、放大镜、查看器,如下图所示,本文讲述这三种工具的使用方法。 一、总览工具 为了便于效果查看与比对,本实验采用全球影像数据(位于配套实验数据包中的0140.rar中),加…

Vue3数据响应式原理

什么是数据响应式 当数据变化时&#xff0c;引用数据的函数&#xff08;副作用函数&#xff09;自动重新执行。 即数据触发了函数的响应&#xff0c;如&#xff1a;视图渲染中使用了某数据&#xff0c;数据改变后&#xff0c;视图跟着自动更新。 触发者&#xff1a;数据 响应者…

机器学习06-正则化

机器学习06-正则化 文章目录 机器学习06-正则化0-核心逻辑脉络1-参考网址3-大模型训练中的正则化1.正则化的定义与作用2.常见的正则化方法及其应用场景2.1 L1正则化&#xff08;Lasso&#xff09;2.2 L2正则化&#xff08;Ridge&#xff09;2.3 弹性网络正则化&#xff08;Elas…

springboot学生成绩管理系统

Spring Boot学生成绩管理系统是一个基于Spring Boot框架开发的&#xff0c;旨在帮助教育机构、学校或教师高效管理学生成绩的系统。 一、系统背景与意义 在教育领域&#xff0c;学生成绩的管理是一项重要且繁琐的工作。传统的手工管理方式不仅效率低下&#xff0c;还容易出错…

13软考高项,项目资源管理

团队章程&#xff1a;价值观&#xff0c;沟通指南&#xff0c;决策标准和过程&#xff0c;冲突处理过程&#xff0c;会议指南和团队共识&#xff01; 资源管理计划&#xff1a;识别资源&#xff0c;获取资源&#xff0c;角色&#xff0c;组织图&#xff0c;培训&#xff0c;团…

Spring AI入门示例HelloWorld

本文重点介绍&#xff0c;基于Spring AI框架&#xff0c;并使用阿里百炼大模型服务平台的AI服务&#xff0c;快速搭建一个springboot工程&#xff0c;并进行简单的AI问答&#xff0c;初步验证Spring AI框架的易用性&#xff0c;以及与阿里巴巴AI框架spring-ai-alibaba-starter的…

git系列之revert回滚

1. Git 使用cherry-pick“摘樱桃” step 1&#xff1a; 本地切到远程分支&#xff0c;对齐要对齐的base分支&#xff0c;举例子 localmap git pull git reset --hard localmap 对应的commit idstep 2&#xff1a; 执行cherry-pick命令 git cherry-pick abc123这样就会将远程…

【C++】结构体(上)

1、结构体基本概念 结构体属于用户自定义当代数据类型&#xff0c;允许用户存储不同当代数据类型 2、结构体定义和使用 语法&#xff1a; struct 结构体名 { 结构体成员列表 }&#xff1b; 通过结构体创建变量的方式有三种&#xff1a; &#xff08;1&#xff09;struc…

技术晋升读书笔记—华为研发

读完《华为研发》第三版&#xff0c;我深感震撼&#xff0c;书中的内容不仅详实地记录了华为公司的成长历程&#xff0c;还揭示了华为成功背后的管理理念和创新思路。这本书通过真实的案例和数据&#xff0c;展示了华为如何从一个小企业发展成全球通信行业的领导者。 一、关键人…

高效实现 Markdown 转 PDF 的跨平台指南20250117

高效实现 Markdown 转 PDF 的跨平台指南 引言 Markdown 文件以其轻量化和灵活性受到开发者和技术写作者的青睐&#xff0c;但如何将其转换为易于分享和打印的 PDF 格式&#xff0c;是一个常见需求。本文整合了 macOS、Windows 和 Linux 三大平台的转换方法&#xff0c;并探讨…

[Mac + Icarus Verilog + gtkwave] Mac运行Verilog及查看波形图

目录 1. MAC安装环境 1. 1 Icarus Verilog 编译 1. 2 gtkwave 查看波形 2. 安装遇到的问题 2. 1 macOS cannot verify that this app is free from malware 2. 2 gtkwave-bin is not compatible with macOS 14 or later 3. 运行示例 3. 1 源代码 3. 2 编译Verilog 3. 3 生成.v…

FRP内网穿透0.61.1新版教程

在上一篇zerotier讲述了如何实现虚拟局域网搭建&#xff0c;这篇会讲述FRP内网穿透的使用教程 那么frp与zerotier的区别是什么呢&#xff1f;&#xff08;说人话&#xff09; FRP 主要用于内网服务向外网的单向暴露。 ZeroTier 用于构建一个虚拟的私有网络&#xff0c;实现多点…

如何通过 Apache Airflow 将数据导入 Elasticsearch

作者&#xff1a;来自 Elastic Andre Luiz 了解如何通过 Apache Airflow 将数据导入 Elasticsearch。 Apache Airflow Apache Airflow 是一个旨在创建、安排&#xff08;schedule&#xff09;和监控工作流的平台。它用于编排 ETL&#xff08;Extract-Transform-Load&#xff0…

通过图形界面展现基于本地知识库构建RAG应用

1. 客户需求 快速完成概念验证(PoC)通过图形界面快速完成演示本地私有数据对比不同模型和成本&#xff0c;决定如何部署 2. 阿里云基于本地知识库构建RAG应用 参考方案&#xff1a; 百炼本地知识库方案 解决方案&#xff1a; FastAPI Gradio Llamaindex qwen-plus 主要三大…

TP4056锂电池充放电芯片教程文章详解·内置驱动电路资源!!!

目录 TP4056工作原理 TP4056引脚详解 TP4056驱动电路图 锂电池充放电板子绘制 编写不易&#xff0c;仅供学习&#xff0c;感谢理解。 TP4056工作原理 TP4056是专门为单节锂电池或锂聚合物电池设计的线性充电器&#xff0c;充电电流可以用外部电阻设定&#xff0c;最大充电…

【Vim Masterclass 笔记21】S09L39:Vim 设置与 vimrc 文件的用法示例(二)

文章目录 S09L39 Vim Settings and the Vimrc File - Part 21 Vim 的配色方案与 color 命令2 map 命令3 示例&#xff1a;用 map 命令快速生成 HTML 代码片段4 Vim 中的 Leader 键5 用 mkvimrc 命令自动生成配置文件 写在前面 本篇为 Vim 自定义配置的第二部分。当中的每个知识…

论文速读|ParGo: Bridging Vision-Language with Partial and Global Views.AAAI25

论文地址&#xff1a;https://arxiv.org/abs/2408.12928 代码地址&#xff1a;https://github.com/bytedance/ParGo bib引用&#xff1a; misc{wang2025pargobridgingvisionlanguagepartial,title{ParGo: Bridging Vision-Language with Partial and Global Views}, author{An…

2024年博客之星年度评选—创作影响力评审入围名单公布

2024年博客之星活动地址https://www.csdn.net/blogstar2024 TOP 300 榜单排名 用户昵称博客主页 身份 认证 评分 原创 博文 评分 平均 质量分评分 互动数据评分 总分排名三掌柜666三掌柜666-CSDN博客1001002001005001wkd_007wkd_007-CSDN博客1001002001005002栗筝ihttps:/…