JSON Web Tokens(JWT)与SpringSecurity如何配合使用?

JSON Web Tokens(JWT)是一种开放标准(RFC 7519),用于在网络应用环境间传递声明(claims)。JWT通常用于身份验证和信息交换,因为它们可以通过数字签名来验证。在Spring Security中,JWT可用于管理用户的认证和授权。

如何在Spring Security中使用JWT

要在Spring Security中使用JWT进行认证流程,你需要按照以下步骤进行:

1. 添加JWT库依赖

为了处理JWT,你需要添加一个处理JWT操作的库。一个常见的库是java-jwtjjwt。在Maven的pom.xml文件中添加依赖:

<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> <!-- 指定你所需的版本 -->
</dependency>
2. 创建JWT工具类

创建一个工具类来生成和解析JWT。这个类将包含创建一个新的JWT令牌和从JWT令牌中解析出用户信息的逻辑。

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;public class JwtUtil {private static final String SECRET_KEY = "my_secret_key"; // 应使用更安全的密钥,并在配置文件中管理// 生成JWT令牌public static String generateToken(String username) {return Jwts.builder().setSubject(username).signWith(SignatureAlgorithm.HS512, SECRET_KEY).compact();}// 从JWT令牌中解析用户名public static String getUsernameFromToken(String token) {return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody().getSubject();}// ... 其他逻辑,如验证令牌有效期
}
3. 创建JWT认证过滤器

创建一个自定义的认证过滤器,用于拦截请求,提取JWT令牌,并验证该令牌:

import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;public class JwtAuthenticationFilter extends UsernamePasswordAuthenticationFilter {@Overrideprotected boolean requiresAuthentication(HttpServletRequest request, HttpServletResponse response) {String jwtToken = resolveToken(request);if (jwtToken != null && JwtUtil.validateToken(jwtToken)) {Authentication auth = getAuthentication(jwtToken);if (auth != null) {SecurityContextHolder.getContext().setAuthentication(auth);}}return false;}private Authentication getAuthentication(String token) {// 使用JwtUtil从令牌中解码出用户名,并创建一个Authentication对象返回// ...}private String resolveToken(HttpServletRequest request) {String bearerToken = request.getHeader("Authorization");if (bearerToken != null && bearerToken.startsWith("Bearer ")) {return bearerToken.substring(7); // 删除"Bearer "前缀}return null;}// ...
}
4. 配置Spring Security

将自定义的JWT认证过滤器与Spring Security集成,并确保其在UsernamePasswordAuthenticationFilter之前运行:

import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http// ....addFilterBefore(new JwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);}
}
5. 处理认证和授权

在控制器中,使用JWT来执行认证和授权时,你可以使用Spring Security的认证注解(如@PreAuthorize),因为在此时用户的认证信息已经存储在Spring Security的SecurityContext中了。

@RestController
public class MyController {@GetMapping("/protected")@PreAuthorize("isAuthenticated()") // 只有通过JWT认证的用户才能访问public ResponseEntity<String> getProtectedResource() {// ...}
}

总结

整合JWT与Spring Security需要创建用于JWT操作的工具类、自定义过滤器来解析请求中的JWT令牌,并在安全上下文中填充认证信息。然后,你需要将这个过滤器配置到Spring Security中,让其在适当的位置拦截请求。最后,服务端的端点可以根据已经验证的凭据进行保护,使用Spring Security提供的方法级别安全注解来控制访问。

注意在生产环境中,密钥(SECRET_KEY)应该是保密的,并且足够复杂,通常会从安全存储的配置中取得,而不是直接硬编码在代码中。更进一步,你可能还会考虑使用JWT的过期时间,刷新令牌机制和其他的安全策略以确保整体的安全性。

另外,JWT认证的逻辑可以根据个人的应用需求进行扩展与调整,例如,你可能需要处理不同形式的认证(如OAuth2),或者需要支持多种验证方法(将基本身份验证或OAuth2与JWT结合使用)。在不同的场景中,Spring Security提供了足够的灵活性来满足这些需求。

在最佳实践中,我们通常会对所有的JWT处理逻辑进行单元测试和集成测试,确保代码的健壮性和安全性。

Spring Security和JWT的结合使用,为Java应用程序带来了一种强大的方式来确保REST API或者其他形式的Web服务的安全性,同时也提供了一种无状态、易于扩展的解决方案,非常适合现代微服务架构。

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

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

相关文章

【Nodejs 日志库 】

总结了几个比较好用的Nodejs日志库&#xff0c;我认为一个 合格的日志库 需要 支持多种传输&#xff0c;如文件、控制台、HTTP 等。可定制的日志级别和格式。异步日志记录。 根据上述的需求&#xff0c;挑选出 几款比较好用的日志库&#xff0c; 1. Winston&#xff08;Gith…

AI学习指南机器学习篇-伯努利朴素贝叶斯算法简介

AI学习指南机器学习篇-伯努利朴素贝叶斯算法简介 1. 伯努利朴素贝叶斯算法的原理 1.1 算法的基本思想 伯努利朴素贝叶斯算法是基于贝叶斯定理和特征条件独立假设的分类算法。其基本思想是通过先验概率和类条件概率来计算后验概率&#xff0c;从而实现对样本进行分类。 1.2 …

直流电机三级串电阻启动

直流电动机在工农业生产中拥有广泛的应用&#xff0c;这主要得益于其调速范围广、调速平稳、过载能力强以及启动和制动转矩大的优点。为了降低起动电流和起动转矩&#xff0c;研究者们探索了直流电动机串电阻起动方法。这种方法通过在直流电动机电枢绕组中串入电阻&#xff0c;…

LeetCode:72. 编辑距离(Java DP)

目录 72. 编辑距离 题目描述&#xff1a; 实现代码与解析&#xff1a; 动态规划 原理思路&#xff1a; 72. 编辑距离 题目描述&#xff1a; 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操…

redis-5.0.5 利用redis-cli搭建集群,并扩缩容分片

背景&#xff1a;安装redis-5.0.5&#xff0c;使用redis-cli搭建redis集群&#xff0c;并扩缩分片。 安装redis-5.0.5 1、官网下载redis-5.0.5.tar.gz&#xff0c;并上传到服务器上。 2、我这里将redis-5.0.5.tar.gz上传至/usr/local/src目录下。 [rootlocalhost src]# ll /…

192.回溯算法:电话号码的字母组合(力扣)

代码解决 class Solution { public:// 定义每个数字对应的字母映射const string letterMap[10] {"", // 0"", // 1"abc", // 2"def", // 3"ghi", // 4"jkl", // 5"mno", // 6"pqrs&…

vscode+picgo+gitee实现Markdown图床

vscode中编辑Markdown文件&#xff0c;复制的图片默认是保存在本地的。当文档上传csdn时&#xff0c;会提示图片无法识别 可以在gitee上创建图床仓库&#xff0c;使用picgo工具上传图片&#xff0c;在Markdown中插入gitee链接的方式来解决该问题。 一、 安装picgo工具 1.1 v…

绿联nas折腾过程中遇到的问题

绿联nas折腾过程中遇到的问题 目录 ssh权限问题超级用户 ssh 权限问题 使用chmod -R 777 目录/ 给指定目录及其所有子目录和文件设置最大的权限&#xff0c;权限设置为 rwxrwxrwx&#xff08;读、写、执行权限给所有用户&#xff09;。这个命令会将目录和文件的权限设置为非…

Kimichat使用案例027:有效使用 kimichat 的15个高级技巧

文章目录 一、明确具体:表达清晰、避免使用模糊措辞。二、提供背景信息:提供相关的细节和背景信息。三、每次只问一个问题四、设定明确的标准五、要求解释六、管理期望七、确定问题类型八、调整语言水平九、提供范例十、及时提供反馈十一、明确对话角色十二、 保持对话的连贯…

Mysql之GROUP BY与PARTITION BY区别

GROUP BY GROUP BY 是一个SQL子句&#xff0c;用于将结果集按一个或多个列进行分组&#xff0c;然后对每个组应用聚合函数&#xff08;如 SUM, COUNT, AVG 等&#xff09;。它会改变查询的结果集&#xff0c;使其只包含每个组的汇总信息。 例如&#xff1a; sql SELECT empl…

Java多线程编程与并发控制策略

Java多线程编程与并发控制策略 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;我想和大家分享一下Java多线程编程与并发控制策略的相关知识&am…

Tableau数据可视化与仪表盘搭建

Tableau的主要目的 数据赋能和数据探索。 数据赋能&#xff1a; 1.分析师可以将数据看板发布到线上给其他部门使用 2.自动更新看板 3.自由下载数据 4.线上修改图表 5.邮件发送数据 6.设置数据预警 数据探索&#xff1a; 1.支持亿级数据的连接和处理 2.自由地对字段进行各种…

目前哪个充电宝品牌比较好?四款优质充电宝分享

在电量成为现代生活不可或缺的生产资源的时代&#xff0c;选择一款优质的充电宝无疑是保证移动设备持续运作的关键。面对市场上众多品牌和型号的充电宝&#xff0c;消费者在选择时可能会感到困惑和迷茫。本文将为您揭示哪些品牌真正代表了耐用性和质量的典范&#xff0c;让自己…

gbase8s获取表的serial字段下一个insert序列值

serial字段&#xff0c;有个函数可以获取到最后插入的序列值&#xff0c;但是好像只能获取到当前会话最后一次插入的序列值&#xff0c;不论是SELECT dbinfo(sqlca.sqlerrd1) FROM dual;&#xff0c;还是select dbinfo(bigserial) from dual;&#xff0c;或者select dbinfo(ser…

Perl语言入门:掌握Perl的基本语法

Perl 是一种高级、通用的、解释型、动态编程语言&#xff0c;最初设计用于文本处理&#xff0c;但随着时间的发展&#xff0c;它的应用已经扩展到许多其他领域。Perl 以其强大的文本处理能力、灵活性和丰富的库而受到程序员的喜爱。本文将详细介绍 Perl 的基本语法&#xff0c;…

Overleaf用法

调整题目和正文之间的间距 调整题目和正文之间的间距\hyphenation{op-tical net-works semi-conduc-tor}\title{Report-20/06/2024} \date{\bigskip\today} 在这里添加间距 \begin{document}\maketitle% \author{Name Surname 1, Name Surname 2} \vspace{3cm} 用vspace控制间…

如果申请小程序地理位置接口权限之前刷到这一篇就好了

小程序地理位置接口有什么功能&#xff1f; 通常情况下&#xff0c;我们在开发小程序时&#xff0c;可能会用到获取用户地理位置信息的功能。小程序开发者开放平台的新规定指出&#xff0c;如果没有申请开通微信小程序地理位置接口&#xff08;getLocation&#xff09;&#xf…

4.XSS-反射型(get)利用:获取cookie

GET反射型XSS利用&#xff1a;获取cookie 修改一下配置文件\pikachu\pkxss\xcookie\cookie.php 我这里将对应的IP地址修改为本地pikachu的主站IP地址&#xff0c;这样给用户造成一种正常视觉上的欺骗&#xff0c;容易上当。重定向到pikachu主页面 基于IP搭建的pkxss平台(入侵…

Python中的多线程实现与GIL(全局解释器锁)的影响

Python中的多线程实现与GIL&#xff08;全局解释器锁&#xff09;的影响 在Python编程中&#xff0c;多线程是一种常见的并发编程技术&#xff0c;它允许程序同时执行多个任务。然而&#xff0c;Python的全局解释器锁&#xff08;GIL&#xff09;对多线程的性能和并发性有着显…

合并有序链表

合并有序链表 图解代码如下 图解 虽然很复杂&#xff0c;但能够很好的理解怎么使用链表&#xff0c;以及对链表的指针类理解 代码如下 Node* merge_list_two_pointer(List& list1, List& list2) {Node* new_head1 list1.head;Node* new_head2 list2.head;Node* s…