spring:Spring Security实践过程中的报错总结

文章目录

    • 问题1
      • 报错
      • 解决
    • 问题2
      • 报错
      • 解决
    • 问题3
      • 报错
      • 解决
    • 问题4
      • 报错
      • 解决
    • 问题5
      • 报错
      • 解决
    • 问题6
      • 报错
      • 解决

问题1

报错

You have entered a password with no PasswordEncoder. If that is your intent, it should be prefixed with {noop}.

解决

Spring Security 期望密码使用 PasswordEncoder 进行编码。如果你想使用明文密码(不推荐在生产环境中使用),你需要用 {noop} 前缀来标识。

  1. 在Spring Security配置中,确保你有一个PasswordEncoder bean。Spring Security 5推荐使用BCryptPasswordEncoder,因为它提供了较强的安全性。
@Bean  
public PasswordEncoder passwordEncoder() {  return new BCryptPasswordEncoder();  
}
  1. 使用PasswordEncoder来加密密码。例如,如果你有一个用户服务,可以在创建或更新用户时加密密码。
@Autowired  
private PasswordEncoder passwordEncoder;  public void createUser(String username, String rawPassword) {  String encodedPassword = passwordEncoder.encode(rawPassword);  // 存储encodedPassword到数据库  
}

问题2

报错

我在客户端调用自定义的路由 /login,提示302,服务端报错
o.s.s.c.bcrypt.BCryptPasswordEncoder : Empty encoded password

解决

其实是因为接口和Spring Security默认的接口冲突了,如/login、/logout

  1. 修改默认登录接口

你可以通过配置Spring Security的HttpSecurity来修改默认的登录接口路径。例如,将默认的登录路径改为 /auth/login:

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().disable().authorizeRequests().antMatchers("/api/public/**").permitAll() // 公开接口.anyRequest().authenticated().and().formLogin().loginProcessingUrl("/auth/login") // 修改登录路径.permitAll(); // 允许所有用户访问}
}
  1. 使用不同的URL

确保你的自定义接口使用不同的URL。例如,如果你的自定义接口是 /api/login,则可以避免与Spring Security默认接口冲突。

问题3

报错

数据库连接报错Public Key Retrieval is not allowed

解决

方案一:修改 JDBC URL
在 JDBC URL 中添加 allowPublicKeyRetrieval=true 参数。这将允许客户端从服务器检索公钥:

jdbc:mysql://localhost:3306/yourDatabase?allowPublicKeyRetrieval=true&useSSL=false

方案二:检查 MySQL 用户权限
确保你使用的 MySQL 用户有权限执行公钥检索。可以通过在 MySQL 中执行以下命令来修改用户权限:

GRANT ALL PRIVILEGES ON yourDatabase.* TO 'yourUser'@'localhost';
FLUSH PRIVILEGES;

方案三:检查 MySQL 配置
在 MySQL 的配置文件(通常是 my.cnf 或 my.ini)中,检查是否有以下配置项:

[mysqld]
caching_sha2_password_auto_generate_rsa_keys=ON

问题4

报错

java17版本执行以下代码报错 java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter

String token = Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS512, secret).compact();

解决

在这里插入图片描述
jwt版本升级到最新0.12.6,但是一些 API 会变换
在版本 0.12.6 中,你需要使用 Jwts.parserBuilder() 来构建 JwtParser,然后再调用 parseClaimsJws。下面是一个示例:

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.JwtParser;public class JwtExample {public static void main(String[] args) {String secret = "your_secret_key"; // 请使用更复杂的密钥String token = "your_jwt_token"; // 请替换为你生成的token// 解析 JWTClaims claims = Jwts.parserBuilder().setSigningKey(secret).build().parseClaimsJws(token).getBody();System.out.println("Parsed Claims: " + claims);}
}

关键变化

  1. Jwts.parserBuilder():
  • 现在使用 Jwts.parserBuilder() 创建一个 JwtParserBuilder 实例。
  1. build() 方法:
  • 在设置完签名密钥后,使用 build() 方法来创建 JwtParser 实例。
  1. parseClaimsJws:
  • 使用构建的 JwtParser 实例调用 parseClaimsJws(token) 方法来解析 JWT。

问题5

报错

io.jsonwebtoken.security.WeakKeyException: The signing key’s size is 152 bits which is not secure enough for the HS512 algorithm. The JWT JWA Specification (RFC 7518, Section 3.2) states that keys used with HS512 MUST have a size >= 512 bits (the key size must be greater than or equal to the hash output size). Consider using the io.jsonwebtoken.security.Keys class’s ‘secretKeyFor(SignatureAlgorithm.HS512)’ method to create a key guaranteed to be secure enough for HS512. See https://tools.ietf.org/html/rfc7518#section-3.2 for more information.

解决

io.jsonwebtoken.security.WeakKeyException 错误表明你使用的签名密钥不够强大,具体来说,HS512 算法要求密钥至少为 512 位。要解决这个问题,你可以使用 io.jsonwebtoken.security.Keys 类中的 secretKeyFor 方法来生成一个安全的密钥。

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;import javax.crypto.SecretKey;public class JwtExample {public static void main(String[] args) {// 使用 Keys 类生成一个安全的密钥SecretKey secretKey = Keys.secretKeyFor(SignatureAlgorithm.HS512);// 生成 JWTClaims claims = Jwts.claims().setSubject("user");String token = Jwts.builder().setClaims(claims).signWith(secretKey).compact();System.out.println("Generated Token: " + token);// 解析 JWTClaims parsedClaims = Jwts.parserBuilder().setSigningKey(secretKey).build().parseClaimsJws(token).getBody();System.out.println("Parsed Claims: " + parsedClaims);}
}

问题6

报错

class java.lang.String cannot be cast to class com.xxx.domain.model.LoginUser (java.lang.String is in module java.base of loader ‘bootstrap’; com.xxx.domain.model.LoginUser is in unnamed module of loader ‘app’)

解决

这个错误的意思是,你在代码中尝试将一个 String 类型的对象转换成 LoginUser 类型的对象

真实原因是SecurityContextHolder.getContext().getAuthentication().getPrincipal()结果是anonymousUser,anonymousUser 是 Spring Security 默认使用的一个特殊标识,表示未认证的用户。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

目前对于后期的打算

在完成了 Python 基本语法的学习后,我犹如推开了编程世界的一扇大门,初窥门径却也深知前方还有广袤无垠的知识天地等待我去探索。Python 作为一门广泛应用于软件开发、数据分析和人工智能等领域的高级编程语言,在当今数字化时代具有举足轻重的…

多种算法解决组合优化问题平台

🏡作者主页:点击! 🤖编程探索专栏:点击! ⏰️创作时间:2024年11月11日7点12分 点击开启你的论文编程之旅https://www.aspiringcode.com/content?id17302099790265&uidef7618fa204346ff9…

C/C++逆向:结构体逆向分析

在C/C程序的逆向分析中,结构体的逆向分析是非常重要的。结构体是C/C中管理和组织数据的一种主要方式。了解它们的布局可以帮助你理解程序是如何存储、处理和传递数据的,结构体常用于组织和管理复杂的数据,理解结构体有助于我们更好地还原程序…

Kettle启动闪退(Couldn‘t read the database cache)

强制关机之后,kettle启动闪退 具体可以用debug模式运行脚本来定位问题 启动之后查看运行日志 DEBUG: Using JAVA_HOME DEBUG: _PENTAHO_JAVA_HOMEC:\Application\JDK DEBUG: _PENTAHO_JAVAC:\Application\JDK\bin\java.exeC:\Application\Kettle\data-integratio…

【机器学习】任务十:从函数分析到机器学习应用与BP神经网络

目录 1.从函数分析到机器学习应用 1.1 3D曲面图可视化报告 1.1.1 目标 1.1.2 代码分析 1.1.3 结果分析 1.1.4 观察与总结 1.1.5 结论 1.2 一元函数梯度计算报告 1.2.1 目标 1.2.2 代码分析 1.2.4 计算结果 1.2.5 优势与意义 1.2.6 结论 1.3 一元函数梯度和二阶导…

写一段python程序,利用时间序列分析的方法,预测股价的趋势

要使用时间序列分析来预测股价趋势,你需要使用统计学方法来分析历史股价数据,并基于这些数据来预测未来的股价走势。以下是一个简单的Python程序,使用ARIMA(自回归积分滑动平均模型)来预测股价趋势。 首先,…

C++初阶——类和对象(中)

目录 1、类的默认成员函数 2、构造函数 3、析构函数 4、拷贝构造函数 5、赋值运算符重载函数 5.1 运算符重载 5.2 赋值运算符重载函数 6、取地址运算符重载函数 6.1 const成员函数 6.2 取地址运算符重载函数 1、类的默认成员函数 默认成员函数就是用户没有显式实现&a…

蓝牙电话-如何做到无人值守(方案探讨)

蓝牙电话-如何做到无人值守(方案探讨) 一、前言 在蓝牙电话出现和在市场上使用的过程中,有好多的客户和友商隐晦或含蓄的咨询,问说蓝牙方案及其构建的体系,能不能做到无人值守?就是那种因业务原因需要把设备…

网络号和网络地址一样吗?真相揭晓

网络号和网络地址是两个在计算机网络领域中经常被提及的概念,尽管它们之间存在一定的关联性,但它们并不等同。为了深入理解这两个概念,我们需要从它们的定义、功能、应用以及相互关系等方面进行详细探讨。 一、网络号的定义与功能 网络号&am…

计算机网络-1.2分层结构

文章目录 三种分层结构OSI 七层模型(Open Systems Interconnection Model)TCP/IP 四层模型混合模型各层之间的关系PDU,SDU,PCIPDU(Protocol Data Unit)SDU(Service Data Unit)PCI(Protocol Cont…

css:还是语法

emmet的使用 emmet是一个插件&#xff0c;Emmet 是 Zen Coding 的升级版&#xff0c;由 Zen Coding 的原作者进行开发&#xff0c;可以快速的编写 HTML、CSS 以及实现其他的功能。很多文本编辑器都支持&#xff0c;我们只是学会使用它&#xff1a; 生成html结构 <!-- emme…

2024年第45周ETF周报

ETF 第45 周 &#xff08; 2024-11-04 至 2024-11-10 &#xff09;周报 核心观点 ETF 业绩表现 股票型ETF周度收益率中位数为4.5831%宽基ETF中&#xff0c;创业板指涨跌幅中位数为6.1644%&#xff0c;跌幅最小。按板块划分&#xff0c;金融涨跌幅中位数为9.1867%&#xff0c…

基于Python的校园爱心帮扶管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

优化时钟网络之时钟抖动

Note&#xff1a;文章内容以Xilinx 7系列FPGA进行讲解 1、什么是时钟抖动 时钟抖动就是时钟周期之间出现的偏差。比如一个时钟周期为10ns的时钟&#xff0c;理想情况下&#xff0c;其上升沿会出现在0ns&#xff0c;10ns&#xff0c;20ns时刻&#xff0c;假设某个上升沿出现的时…

ORB-SLAM2源码学习:MapPoint.cc: MapPoint::PredictScale()预测一个尺度

前言 这部分是根据帧或者关键帧的地图点的深度来预测它对应的二维特征点所在的金字塔层级。 1.函数声明 1.预测地图点对应特征点所在的图像金字塔尺度层数 /*预测地图点对应特征点所在的图像金字塔尺度层数currentDist 相机光心距离地图点距离pKF 关键帧return…

与 Magic Quadrant™ 低代码领导者一起满足您的开发需求

2024 年 Gartner 企业低代码应用平台魔力象限™Gartner Magic Quadrant™ for Enterprise Low-Code Application PlatformsDownload the Gartner Magic Quadrant to gain a deeper understanding of the fast-growing low-code market and which vendors best align with your …

【CFD教程】7分钟学会电子机箱的强迫风冷模拟

1 案例背景 电子机箱是承载电子设备的箱体&#xff0c;比如电脑主机。机箱内电子元件工作会发热&#xff0c;为了让热量及时排出&#xff0c;常用风扇强迫外界空气流经机箱&#xff0c;进行散热。本仿真目的是计算电子元件发热功率及进风量一定时&#xff0c;机箱内的温度分布…

亚信安全并购亚信科技交易正式完成

亚信安全与亚信科技联合宣布&#xff0c;亚信安全正式完成对亚信科技的控股权收购&#xff0c;由此&#xff0c;规模近百亿的中国最大的软件企业之一诞生&#xff01;双方将全面实现公司发展战略&#xff0c;以及优势能力与资源的深度融合&#xff0c;形成业界独有的“懂网、懂…

HarmonyOS NEXT应用元服务开发Intents Kit(意图框架服务)技能调用接入方案

一、方案概述 开发者需要按照意图定义&#xff0c;进行意图注册并实现意图调用&#xff1b;用户通过对小艺对话进行自然语言输入&#xff0c;小艺理解语义转换成意图调用&#xff08;含意图参数&#xff09;&#xff0c;执行意图调用实现对应交互体验。 端侧意图注册 以“搜索…

Java面试要点03 - String、StringBuilder与StringBuffer全面对比

本文目录 一、引言二、String的特性与实现原理三、StringBuilder的工作机制四、StringBuffer的同步机制五、性能对比与分析六、最佳实践与应用场景七、总结 一、引言 在Java中&#xff0c;字符串操作是最常见的编程任务之一。Java提供了三种主要的字符串处理类&#xff1a;Str…