JWT与shiro结合实现认证

随着微服务架构的普及和前后端分离的趋势,越来越多的项目开始采用无状态的认证机制,其中JSON Web Token(JWT)成为了一种流行的选择。与此同时,Apache Shiro作为一个强大且易于使用的Java安全框架,仍然被广泛应用于企业级应用的安全管理中。

1. JWT简介

JWT是一种开放标准(RFC 7519),用于在各方之间安全地传输信息。JWT由三个部分组成:头部(Header)、载荷(Payload)和签名(Signature)。JWT的最大特点是它是自包含的,这意味着所有必要的信息都存储在令牌本身内,因此不需要查询数据库来验证用户身份。这使得JWT非常适合跨域资源共享(CORS)场景下的认证。

2. Apache Shiro概述

Apache Shiro是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能。Shiro的设计目的是让开发人员能够轻松地处理安全相关的问题,而无需深入理解底层的安全细节。Shiro支持多种认证机制,包括传统的基于会话的认证以及无状态的认证,如JWT。

3. JWT与Shiro的集成

要在Java项目中使用JWT和Shiro,需要完成以下几个步骤:

3.1 引入依赖

首先,在项目的pom.xml文件中添加Shiro和JWT相关的依赖库。例如,使用jjwt库来处理JWT操作:

<dependencies><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.7.1</version></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.11.2</version></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId><version>0.11.2</version></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-jackson</artifactId><version>0.11.2</version></dependency>
</dependencies>
3.2 配置Shiro

接下来,需要配置Shiro以支持JWT。这通常涉及到创建自定义的Realm来处理JWT认证逻辑,并设置过滤器链来决定哪些URL需要认证。

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;public class JwtRealm extends AuthorizingRealm {@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {String jwt = (String) token.getPrincipal();Claims claims = Jwts.parser().setSigningKey("your-secret-key").parseClaimsJws(jwt).getBody();// 验证JWT有效性...if (claims != null) {return new SimpleAuthenticationInfo(claims.getSubject(), jwt, getName());}throw new AuthenticationException("Invalid JWT token");}
}
3.3 创建JWT

为了生成JWT,可以利用io.jsonwebtoken库提供的方法:

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;public String createJwt(String username) {return Jwts.builder().setSubject(username).signWith(SignatureAlgorithm.HS256, "your-secret-key").compact();
}
3.4 验证JWT

每当收到客户端的请求时,都需要验证JWT是否有效。这通常在过滤器中实现:

import org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;public class JwtFilter extends BasicHttpAuthenticationFilter {@Overrideprotected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {HttpServletRequest httpServletRequest = (HttpServletRequest) request;String token = httpServletRequest.getHeader("Authorization");try {if (token == null || !validateToken(token)) {return false;}} catch (Exception e) {return false;}return true;}private boolean validateToken(String token) {// 在这里实现JWT验证逻辑...return true; // 示例代码}
}
4. 总结

通过上述步骤,可以在Java项目中实现基于JWT和Shiro的安全认证机制。这种做法的好处在于它不仅简化了认证过程,而且提高了系统的可扩展性和安全性。需要注意的是,实际项目中还需要考虑更多的细节,比如JWT的过期处理、刷新机制等。此外,为了保证安全性,应该使用足够复杂的密钥,并且定期更换密钥。

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

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

相关文章

Windows电脑获取目录及子目录结构及包含文件名的命令

在Windows 11中&#xff0c;你可以使用多种方式来获取当前目录及其子目录的结构&#xff0c;包括文件名。最直接且广泛使用的方法是使用命令行工具&#xff0c;如cmd&#xff08;命令提示符&#xff09;或PowerShell。下面是两种不同方式来实现这一需求的示例。 使用cmd&#…

负载均衡 Ribbon 与 Fegin 远程调用原理

文章目录 一、什么是负载均衡二、Ribbon 负载均衡2.1 Ribbon 使用2.2 Ribbon 实现原理 (★)2.3 Ribbon 负载均衡算法 三、Feign 远程调用3.1 Feign 简述3.2 Feign 的集成3.3 Feign 实现原理 (★) 一、什么是负载均衡 《服务治理&#xff1a;Nacos 注册中心》 末尾提到了负载均…

Vue2和Vue3项目创建的区别和 element ui 和element plus的导入方式

文章目录 创建项目Vue2Vue3 Vue2项目机构Vue 2 Element UI VUE3项目结构Vue 3 Element Plus 创建项目 Vue2 Vue CLI 3 及之前版本&#xff1a; 使用 vue-cli 创建项目&#xff1a; npm install -g vue/cli vue create my-project-vue2 cd my-project-vue2Vue3 Vue CLI 4…

第二十篇——行军篇:别指望外援,好好培养亲兵

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 微观层面&#xff0c;从驯服的视角&#xff0c;我们可以洞察到人性中非常…

一篇文章深入了解Oracle常用命令

1. 数据库 1.1. 数据库启动 & 关闭 –启动数据库 SQL> startup nomount; SQL> alter database mount; SQL> alter database open;–关闭数据库 SQL> shutdown immediate&#xff1b;1.2. 连接数据库 –登录普通用户 SQL>sqlplus 用户名/密码实例名–…

2024.9.4

继续该题&#xff0c;除了实在改不来的&#xff0c;基本快改完了 #2316. 飓风&#xff08;hurricane&#xff09; #1575. 【EOJ Long Round】本质不同GCD 被hack了重新写一下&#xff0c;乱搞复杂度大了点 #2303. 最小子列&#xff08;subseq&#xff09; 先从没有限制考虑起&a…

leveldb源码剖析(二)——LSM Tree

LSM Tree LSM Tree&#xff1a;Log-Structured Merge Tree&#xff0c;日志结构合并树。是一种频繁写性能很高的数据结构。 LSM Tree将写入操作与合并操作分离&#xff0c;数据首先写入磁盘中的日志文件&#xff08;WAL&#xff09;&#xff0c;随后写入内存缓存&#xff0c;…

UDP英译汉网络词典

这里我们用UDP实现一个简单的英译汉小词典。我们还是仿照前一篇的UDP编程&#xff0c;将各自的组件封装起来&#xff0c;实现高内聚低耦合。 一. 字典翻译功能实现 首先我们将我们的字典知识库放在txt文本中。 apple: 苹果 banana: 香蕉 cat: 猫 dog: 狗 book: 书 pen: 笔 ha…

云计算之ECS

目录 一、ECS云服务器 1.1 ECS的构成 1.2 ECS的实例规格 1.3 镜像 1.4 磁盘 1.5 安全组 1.6 网络 1.7 产品结构 二、块存储介绍 2.1 快存储定义 2.2 块存储性能指标 2.3 快存储常用操作-云盘扩容 2.4 块存储常见问题 三、快照介绍 3.1 快照定义 3.2 快照常见问题…

flume 使用 exec 采集容器日志,转储磁盘

flume 使用 exec 采集容器日志&#xff0c;转储磁盘 在该场景下&#xff0c;docker 服务为superset&#xff0c;flume 的sources 选择 exec &#xff0c; sinks选择 file roll 。 任务配置 具体配置文件如下&#xff1a; #simple.conf: A single-node Flume configuration#…

随笔(1)将 CSV 文件导入 MySQL 时出现中文乱码问题解决方案

将 CSV 文件导入 MySQL 时出现中文乱码问题解决方案 一、检查 CSV 文件编码 确认 CSV 文件的编码格式。常见的编码有 UTF-8、GBK 等。你可以使用文本编辑器&#xff08;如 Notepad&#xff09;打开 CSV 文件&#xff0c;查看其编码格式。如果编码格式不是 UTF-8&#xff0c;可…

GPT-4o mini轻量级大模型颠覆AI的未来

GPT-4o mini发布&#xff0c;轻量级大模型如何颠覆AI的未来&#xff1f; 引言 随着人工智能技术的飞速发展&#xff0c;大型AI模型的发布已成常态。然而&#xff0c;庞大的计算资源和存储空间限制了它们在广泛场景中的应用。为满足市场需求&#xff0c;轻量级大模型应运而生&a…

TOMATO靶机漏洞复现

步骤一&#xff0c;我们来到tomato页面 什么也弄不了只有一番茄图片 弱口令不行&#xff0c;xxs也不行&#xff0c;xxe还是不行 我们来使用kali来操作... 步骤二&#xff0c;使用dirb再扫一下, dirb http://172.16.1.133 1.发现这个文件可以访问.我们来访问一下 /antibot_i…

【课程学习】信号检测与估计

文章目录 3.7-CRB延展到向量的形式3.8-参数变换形式的CRB CRB for transformation, pp45-463.9-高斯分布 CRLB for the General Gaussian Case3.7-CRB延展到向量的形式 0904 向量和变换形式的CRLB形式 估计参数真实值 θ \theta θ,估计值 θ ^ \hat \theta θ^ 与信号与系统…

C# NX二次开发-获取对象名称

UG软件是所有带标签对象都能设置名称和属性&#xff1a; 代码&#xff1a; theUf.Obj.AskName(body.Tag,out string name);name.NxListing(); 免责声明&#xff1a; 只用于参考&#xff0c;如果有什么问题不要找我呀。

NewStringUTF和GetStringUTFChars 的差别

NewStringUTF 和 GetStringUTFChars 是 JNI&#xff08;Java Native Interface&#xff09;提供的两个函数&#xff0c;它们都用于在 JNI 代码中处理字符串&#xff0c;但用途和行为有所不同&#xff1a; NewStringUTF 功能&#xff1a;NewStringUTF 用于在 JNI 代码中创建一个…

【JAVA入门】Day27 - 单列集合体系结构综述

【JAVA入门】Day27 - 单列集合体系结构 文章目录 【JAVA入门】Day27 - 单列集合体系结构1.1 Collection 集合的基本方法1.2 Collection 集合的遍历方式1.2.1 迭代器遍历1.2.2 增强 for 遍历1.2.3 利用 Lambda 表达式进行遍历 1.3 List 集合的基本方法1.4 List 集合的遍历方式 J…

WordPress自适应美图网站整站打包源码

直接服务器整站源码数据库打包了&#xff0c;恢复一下就可以直接投入使用。保证好用易用&#xff0c;无需独立服务器就可以使用。 强调一下&#xff0c;我这个和其他地方的不一样、不一样、不一样。具体的看下面的说明。 现在网络上同样的资源包都是用的加密带后门的主题&…

年化收益37.7%的A股小市值策略,小市值和动量因子长期有效(附具体逻辑)

“ 原创内容第640篇&#xff0c;专注量化投资、个人成长与财富自由” 股票的“小市值”策略&#xff0c;就像ETF的趋势动量一样&#xff0c;长期有效。 这是一个很神奇的异象。 年化37.07%&#xff0c;夏普0.89。 这里我做了一些特殊的处理&#xff1a; 1、包括排除了科创板…

LeetCode 2860.让所有学生保持开心的分组方法数:排序+遍历

【LetMeFly】2860.让所有学生保持开心的分组方法数&#xff1a;排序遍历 力扣题目链接&#xff1a;https://leetcode.cn/problems/happy-students/ 给你一个下标从 0 开始、长度为 n 的整数数组 nums &#xff0c;其中 n 是班级中学生的总数。班主任希望能够在让所有学生保持…