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

终极指南:如何使用Apache Shiro与JWT实现现代Web应用的无状态认证

终极指南:如何使用Apache Shiro与JWT实现现代Web应用的无状态认证

【免费下载链接】shiroApache Shiro is a powerful and easy-to-use Java security framework that performs authentication, authorization, cryptography, and session management项目地址: https://gitcode.com/gh_mirrors/shiro1/shiro

Apache Shiro是一个功能强大且易于使用的Java安全框架,提供身份验证、授权、加密和会话管理功能。在现代Web应用开发中,将Apache Shiro与JWT(JSON Web Token)集成实现无状态认证已成为主流实践,它能有效解决分布式系统中的身份验证挑战。

🤔 为什么选择Shiro与JWT集成?

传统的基于会话的认证方式在分布式系统中面临诸多挑战,如会话共享、服务器负载等问题。而JWT作为一种轻量级的身份验证令牌,能够在客户端存储用户信息,实现无状态认证,非常适合前后端分离和微服务架构。

Apache Shiro提供了灵活的认证机制,通过与JWT结合,可以充分发挥两者的优势:

  • 无状态设计:减轻服务器存储压力,便于水平扩展
  • 跨域支持:轻松实现跨域认证
  • 减少数据库查询:令牌中包含用户基本信息,减少不必要的数据库访问
  • 增强安全性:支持签名验证,防止令牌被篡改

Apache Shiro框架标志 - 提供强大的Java安全解决方案

🚀 快速集成步骤

1. 添加依赖

首先需要在项目的pom.xml中添加Shiro和JWT相关依赖。以下是主要依赖项:

<!-- Apache Shiro核心依赖 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.10.0</version> </dependency> <!-- Shiro Web支持 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-web</artifactId> <version>1.10.0</version> </dependency> <!-- JWT支持 --> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>0.11.5</version> </dependency>

2. 实现JWT工具类

创建JWT工具类负责令牌的生成、验证和解析。关键实现包括:

  • 生成JWT令牌
  • 验证令牌有效性
  • 从令牌中提取用户信息

核心实现代码位于src/main/java/org/apache/shiro/web/jwt/JwtUtils.java,主要方法包括generateToken()validateToken()getUsernameFromToken()

3. 自定义Shiro过滤器

创建JWT过滤器继承AccessControlFilter,用于拦截请求并验证JWT令牌:

public class JwtFilter extends AccessControlFilter { @Override protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) { // 实现令牌验证逻辑 return false; } @Override protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception { // 处理未授权请求 return false; } }

4. 配置Shiro安全管理器

在Shiro配置类中,配置自定义的Realm和过滤器:

@Configuration public class ShiroConfig { @Bean public SecurityManager securityManager() { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(jwtRealm()); return securityManager; } @Bean public JwtRealm jwtRealm() { return new JwtRealm(); } // 配置Shiro过滤器 }

安全锁图标 - 象征Shiro与JWT提供的安全保护

⚙️ 核心实现详解

JWT Realm实现

自定义Realm类继承AuthorizingRealm,重写身份验证和授权方法:

public class JwtRealm extends AuthorizingRealm { @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { // 实现授权逻辑 SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); // 添加角色和权限 return authorizationInfo; } @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { // 实现JWT令牌验证逻辑 String jwtToken = (String) token.getPrincipal(); // 验证令牌并返回认证信息 return new SimpleAuthenticationInfo(username, jwtToken, getName()); } }

配置Shiro过滤器链

在Shiro配置中设置URL过滤规则,指定哪些路径需要认证:

@Bean public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) { ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean(); shiroFilter.setSecurityManager(securityManager); Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>(); // 配置不需要认证的路径 filterChainDefinitionMap.put("/api/login", "anon"); // 其他路径需要认证 filterChainDefinitionMap.put("/api/**", "jwt"); shiroFilter.setFilterChainDefinitionMap(filterChainDefinitionMap); return shiroFilter; }

🔒 安全最佳实践

令牌管理策略

  • 合理设置过期时间:根据业务需求设置合适的令牌过期时间,一般建议15-30分钟
  • 实现令牌刷新机制:当令牌即将过期时,自动刷新令牌
  • 维护黑名单:对于已注销但未过期的令牌,加入黑名单进行过滤

密码加密处理

使用Shiro提供的加密模块对用户密码进行加密存储:

// 使用Shiro的密码加密工具 String hashedPassword = new SimpleHash("SHA-256", password, salt, 1024).toHex();

相关实现可参考core/src/main/java/org/apache/shiro/authc/credential/DefaultPasswordService.java

Apache软件基金会标志 - Shiro是Apache旗下的开源项目

📝 总结

Apache Shiro与JWT的集成为现代Web应用提供了强大而灵活的无状态认证解决方案。通过本文介绍的步骤,你可以快速实现这一集成,为你的应用提供安全、高效的身份验证机制。

关键要点回顾:

  • Shiro与JWT集成实现无状态认证,适合分布式系统
  • 核心步骤包括添加依赖、实现JWT工具类、自定义过滤器和Realm
  • 遵循安全最佳实践,如合理设置令牌过期时间、密码加密等
  • 参考项目中的web/src/main/java/org/apache/shiro/web/目录下的相关实现

通过这种集成方式,你可以构建更加安全、可扩展的Web应用,满足现代应用架构的需求。

【免费下载链接】shiroApache Shiro is a powerful and easy-to-use Java security framework that performs authentication, authorization, cryptography, and session management项目地址: https://gitcode.com/gh_mirrors/shiro1/shiro

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.jsqmd.com/news/632081/

相关文章:

  • 微软发布的《生成式人工智能初学者.NET 第二版》课程谒
  • 深度剖析Open-XML-SDK架构:从框架设计到实现原理的完整指南
  • Dhall安全保证揭秘:如何避免配置文件的7大常见陷阱
  • 2026年4月路牙石品牌推荐,台阶石/石材/路牙石/火烧板/花岗岩石材/花坛石/蘑菇石/树坑石/路沿石,路牙石门店哪家强 - 品牌推荐师
  • 2026年实力强的青岛市高新技术企业申报/高新技术企业研发投入奖励申报专业公司推荐 - 行业平台推荐
  • PhotoEditor保存功能完整指南:从图片导出到文件管理的所有细节
  • ts-proto入门指南:如何将.proto文件转换为TypeScript类型定义
  • R语言中的循环与取模运算
  • 如何快速开发Docfx文档处理器:从零开始构建自定义扩展
  • 终极RT-DETR社区贡献指南:从新手到核心开发者的完整路径
  • Microsoft Agent Framework Skills 执行 Scripts(实战指南)倬
  • 等保.三级要求下Redis 安全测评应该怎么做?偶
  • 2026年Q2诚信Socks5代理解析:牛牛ip/牛牛加速/模拟器/短效IP/静态IP/SDK包/http/socks5/选择指南 - 优质品牌商家
  • 终极JHenTai插件开发指南:从零开始扩展跨平台漫画应用功能
  • 告别编译臃肿!手把手教你为Arduino UNO打造极简中文OLED菜单(基于U8g2自定义字库)
  • 为什么Expose是摄影师的最佳选择?10大优势全面解析
  • 终极Haxl缓存策略指南:如何彻底避免重复请求提升应用性能
  • 2026鄢陵补牙医院实力解析:鄢陵种牙医院、鄢陵种牙诊所、鄢陵窝沟封闭医院、鄢陵窝沟封闭诊所、鄢陵补牙医院、鄢陵补牙诊所选择指南 - 优质品牌商家
  • CThunk:嵌入式C++中零开销C风格回调适配方案
  • 终极字体优化指南:让你的home55个人主页加载速度提升50%的实用技巧
  • 芦苇AI(papervv)怎么使用? 简单三步,输入需求,生成内容
  • SitemapGenerator适配器详解:6种存储方案对比与选择
  • 2026正规网带提升机TOP5推荐:链条传动网带/链板转弯机/链板输送带/链板输送机/食品输送网带/304不锈钢网带/选择指南 - 优质品牌商家
  • 别再只玩VAE了!用CVAE玩点新花样:可控图像生成与风格迁移实战
  • 如何用AutoTrain Advanced评估文本命名实体识别:实体级与类别级指标完整指南
  • 10个Yellowbrick可视化技巧:提升机器学习模型诊断效率
  • 如何优化Vim插件安装速度:掌握vim-plug的--threads参数最佳使用策略
  • TinyMatrixMath:嵌入式C++编译期矩阵计算库
  • 终极指南:如何突破Windows安全限制实现系统管理自由
  • PowerShell中的WinUI3 GUI编程