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

别再乱配Shiro了!Spring Boot整合Shiro实现Token登录,这份配置清单请收好

Spring Boot与Shiro的Token认证实践指南在当今的Web应用开发中认证与授权机制是保障系统安全的核心组件。许多开发者选择Apache Shiro作为安全框架但在与Spring Boot整合时尤其是采用Token认证模式时常常会遇到各种配置难题。本文将系统性地梳理Spring Boot整合Shiro实现Token认证的关键配置点帮助开发者避开常见陷阱。1. 基础环境搭建在开始配置之前我们需要确保项目基础环境正确搭建。创建一个新的Spring Boot项目并添加以下核心依赖dependencies !-- Spring Boot Starter Web -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- Apache Shiro -- dependency groupIdorg.apache.shiro/groupId artifactIdshiro-spring-boot-web-starter/artifactId version1.9.0/version /dependency !-- JWT支持可选 -- dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt/artifactId version0.9.1/version /dependency /dependencies关键配置检查清单确保Shiro版本与Spring Boot版本兼容如果使用JWT选择合适的JWT库版本检查依赖冲突特别是与Spring Security的冲突2. Shiro核心配置详解Shiro的核心配置主要集中在ShiroConfig类中这个类需要包含以下几个关键Bean的定义Configuration public class ShiroConfig { Bean public SecurityManager securityManager(CustomRealm customRealm) { DefaultWebSecurityManager securityManager new DefaultWebSecurityManager(); securityManager.setRealm(customRealm); securityManager.setSessionManager(sessionManager()); return securityManager; } Bean public SessionManager sessionManager() { DefaultWebSessionManager sessionManager new DefaultWebSessionManager(); sessionManager.setSessionValidationSchedulerEnabled(true); sessionManager.setSessionIdUrlRewritingEnabled(false); return sessionManager; } Bean public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) { ShiroFilterFactoryBean shiroFilter new ShiroFilterFactoryBean(); shiroFilter.setSecurityManager(securityManager); // 配置自定义过滤器 MapString, Filter filters new HashMap(); filters.put(tokenAuth, new TokenAuthenticationFilter()); shiroFilter.setFilters(filters); // 配置拦截规则 MapString, String filterMap new LinkedHashMap(); filterMap.put(/api/login, anon); filterMap.put(/api/public/**, anon); filterMap.put(/api/**, tokenAuth); shiroFilter.setFilterChainDefinitionMap(filterMap); return shiroFilter; } }关键点解析配置项说明常见问题SecurityManagerShiro安全核心必须正确设置Realm和SessionManagerSessionManager会话管理禁用URL重写可提高安全性ShiroFilterFactoryBean请求过滤拦截规则顺序很重要3. 自定义Token认证实现Token认证的核心在于自定义Realm和Filter。以下是实现Token认证的关键组件3.1 自定义Realm实现public class CustomRealm extends AuthorizingRealm { Override public boolean supports(AuthenticationToken token) { return token instanceof JwtToken; } Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { String username (String) principals.getPrimaryPrincipal(); SimpleAuthorizationInfo info new SimpleAuthorizationInfo(); // 添加角色和权限 info.addRoles(getRolesForUser(username)); info.addStringPermissions(getPermissionsForUser(username)); return info; } Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { JwtToken jwtToken (JwtToken) token; String jwt (String) jwtToken.getCredentials(); // 验证JWT有效性 if (!validateToken(jwt)) { throw new AuthenticationException(Invalid token); } String username extractUsernameFromToken(jwt); return new SimpleAuthenticationInfo(username, jwt, getName()); } }3.2 自定义Token过滤器public class TokenAuthenticationFilter extends AuthenticatingFilter { Override protected AuthenticationToken createToken(ServletRequest request, ServletResponse response) { HttpServletRequest httpRequest (HttpServletRequest) request; String token httpRequest.getHeader(Authorization); if (token null || !token.startsWith(Bearer )) { return null; } return new JwtToken(token.substring(7)); } Override protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception { if (executeLogin(request, response)) { return true; } ((HttpServletResponse) response).sendError(HttpServletResponse.SC_UNAUTHORIZED); return false; } }Token处理流程客户端发送请求携带Token过滤器提取Token并创建认证TokenShiro调用Realm进行认证认证成功后进行授权检查请求继续处理或返回错误4. 登录与Token生成登录接口需要生成Token并返回给客户端RestController RequestMapping(/api) public class AuthController { PostMapping(/login) public ResponseEntity? login(RequestBody LoginRequest request) { // 验证用户名密码 Subject subject SecurityUtils.getSubject(); UsernamePasswordToken token new UsernamePasswordToken( request.getUsername(), request.getPassword() ); try { subject.login(token); // 生成JWT String jwtToken Jwts.builder() .setSubject(request.getUsername()) .setExpiration(new Date(System.currentTimeMillis() 3600000)) .signWith(SignatureAlgorithm.HS512, secretKey) .compact(); return ResponseEntity.ok(new AuthResponse(jwtToken)); } catch (AuthenticationException e) { return ResponseEntity.status(401).body(Invalid credentials); } } }Token生成最佳实践设置合理的过期时间使用安全的签名算法不要在Token中存储敏感信息考虑使用Refresh Token机制5. 高级配置与优化5.1 集群环境支持在集群环境中需要考虑Session共享问题。可以通过以下方式实现Bean ConditionalOnProperty(name cluster.enabled, havingValue true) public SessionManager clusterSessionManager(RedisTemplateString, Object redisTemplate) { RedisSessionDAO sessionDAO new RedisSessionDAO(); sessionDAO.setRedisTemplate(redisTemplate); DefaultWebSessionManager sessionManager new DefaultWebSessionManager(); sessionManager.setSessionDAO(sessionDAO); return sessionManager; }5.2 性能优化对于高并发场景可以考虑以下优化措施缓存授权信息在Realm中实现缓存机制Token黑名单实现Token失效机制异步验证对于耗时操作采用异步方式Bean public CacheManager shiroCacheManager(RedisTemplateString, Object redisTemplate) { RedisCacheManager cacheManager new RedisCacheManager(); cacheManager.setRedisTemplate(redisTemplate); return cacheManager; } Bean public SecurityManager securityManager(CustomRealm customRealm, CacheManager cacheManager) { DefaultWebSecurityManager securityManager new DefaultWebSecurityManager(); securityManager.setRealm(customRealm); securityManager.setCacheManager(cacheManager); return securityManager; }6. 常见问题排查在实际项目中经常会遇到以下问题Filter不生效检查Filter是否注册到ShiroFilterFactoryBean确认拦截规则配置正确依赖注入失败确保Filter是通过ShiroFilterFactoryBean注册考虑使用静态方法获取Bean跨域问题确保CORS配置在Shiro过滤器之前执行在Filter中正确处理OPTIONS请求public class TokenAuthenticationFilter extends AuthenticatingFilter { Override protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) { if (((HttpServletRequest) request).getMethod().equals(OPTIONS)) { return true; } return super.isAccessAllowed(request, response, mappedValue); } }在实际项目中整合Spring Boot和Shiro实现Token认证时关键是要理解各个组件的职责和交互方式。通过本文提供的配置清单和最佳实践开发者可以快速搭建安全可靠的认证系统同时避免常见的配置错误。

相关文章:

别再乱配Shiro了!Spring Boot整合Shiro实现Token登录,这份配置清单请收好

Spring Boot与Shiro的Token认证实践指南 在当今的Web应用开发中,认证与授权机制是保障系统安全的核心组件。许多开发者选择Apache Shiro作为安全框架,但在与Spring Boot整合时,尤其是采用Token认证模式时,常常会遇到各种配置难题…...

配置操作失败数量统计

题目描述: 模拟一个系统的命令行配置,包含添加、修改、删除三项操作,详情如下: 添加操作命令:add_rulerule_id=1rule_index = 18 修改操作命令: mod_rule rule_id= 1rule_index = 100 删除操作命令:del_rulerule_id=1 其中:add_rule、mod_rule、del_rule 是操作关键字,rule…...

Huggingface镜像站模型加载:从OSError到无缝离线的环境配置实战

1. 当镜像站模型加载失败时,你真正需要排查的5个关键点 第一次看到OSError: We couldnt connect to https://hf-mirror.com这个报错时,我正赶着在客户现场演示一个本地部署的文本生成模型。明明前一天在办公室测试好好的,换了台机器就死活加载…...

全球非洲科技展聚焦非洲数字化发展

“2026全球非洲科技展”3月28日在阿尔及利亚首都阿尔及尔开幕,本次展会聚焦推动非洲数字基础设施建设和促进非洲技术主权。 联合国副秘书长、秘书长数字和新兴技术特使阿曼迪普辛格吉尔在开幕致辞中表示,非洲各国应携手合作,制定自己的人工智…...

【无标题】《背包塞不下?贪心算法教你“碎尸万段”也能价值最大(附C代码)》

今天分享一下连续背包问题的贪心算法题目:连续背包问题是这样定义的:给定一个总承重量为 W 的背包和 n 件物品的集合 S{s1​,⋯,sn​},其中第 i 件物品有其重量 wi​ 和价值 vi​。如果将第 i 件物品 si​ 的 xi​ 部分(xi​∈[0,…...

物流转行网络安全自学经验,零基础自学网络安全,血泪泪的干货分享

前言 当每台设备都成为攻击入口,每个漏洞都可能摧毁商业帝国。这不是危言耸听——Akamai 2024报告显示:全球企业因网络攻击每小时损失114万美元。但危机中藏着机遇:即便零基础转行者,掌握安全技术也能成为数字世界的“免疫细胞”…...

Semtech SX9324 SAR传感器在笔记本电脑中的应用:如何优化WWAN性能与合规性

Semtech SX9324 SAR传感器在笔记本电脑中的智能功率调控实践 当你在咖啡厅用笔记本视频会议时,是否注意过机身侧面的金属触点?这些不起眼的小元件背后,藏着确保无线性能与安全合规的精密控制系统。作为射频工程师,我们近年来在高端…...

关闭谷歌浏览器(Google Chrome)自动更新方法

禁用谷歌浏览器更新服务去除更新窗口提示辅助设置禁止更新操作 删除计划任务设置Update文件夹权限控制 关闭谷歌浏览器(Google Chrome)自动更新方法,本人实测,步骤清晰: PS:如果你想下载历史版本,可以看这里&#x…...

RACI 矩阵是什么

RACI 是企业项目管理、流程权责划分的经典责任分配矩阵,用来清晰定义一项工作 / 任务中,每个人 / 部门具体扮演什么角色,杜绝权责不清、推诿扯皮、重复干活、没人兜底的问题。一、四个字母核心定义表格字母英文全称中文名称核心职责RResponsi…...

linux进程是否在容器里

判断一个 Linux 进程是否运行在容器&#xff08;Docker、K8s、containerd 等&#xff09;里&#xff0c;最可靠的是看 cgroup 路径、PID 命名空间、根目录 / 挂载信息。检查 cgroup 容器进程的 /proc/<pid>/cgroup 会包含容器运行时标识&#xff1a;Docker&#xff1a;/d…...

海洋边缘计算:Switch与Forwarder底层网络架构实战

摘要&#xff1a;在复杂的海洋工业环境中&#xff0c;边缘通信节点的架构直接影响系统的隔离能力。本文从嵌入式Linux底层出发&#xff0c;剥析通用海事网关的处理逻辑&#xff0c;演示利用代码构建防御管道。 导语&#xff1a;随着船舶工业向IT与OT深度融合演进&#xff0c;为…...

IP地址到底是什么?一张图看懂+命令行/网站查询实操

在调试网络、配置服务器或排查登录风控时&#xff0c;几乎每天都要面对IP地址。但如果你问身边的人“IP到底是什么”&#xff0c;可能很多人都会一愣——能说出全称“互联网协议地址”的人不少&#xff0c;但真正理解它是什么、怎么用、如何快速查到自己的IP&#xff0c;还真不…...

从零到一:用ima构建你的专属知识大脑【手把手教学】

1. 为什么你需要一个"第二大脑"&#xff1f; 每天早上打开电脑&#xff0c;你是不是也和我一样&#xff0c;面对满桌面的文档、收藏夹里几百个未读网页、微信里收藏的无数文章感到无从下手&#xff1f;我们的大脑就像一台内存有限的电脑&#xff0c;每天接收海量信息…...

解决NextCloud无法挂载SMB/CIFS共享的smbclient安装指南

1. 为什么NextCloud需要smbclient&#xff1f; 很多朋友在搭建NextCloud私有云时&#xff0c;都会遇到一个头疼的问题&#xff1a;明明服务器配置没问题&#xff0c;但就是无法挂载SMB/CIFS共享存储。这个问题90%的情况都是因为缺少smbclient组件。我去年给客户部署NextCloud时…...

如何精准控制固定定位头部容器中各元素的布局位置

本文详解如何在 position: fixed 的头部容器中统一管理子元素定位&#xff0c;解决因 top/left 百分比值导致的错位问题&#xff0c;通过重置定位基准、合理使用 flex 布局与相对/绝对定位组合&#xff0c;实现像素级可控的悬浮下拉菜单及整体 ui 对齐。 本文详解如何在 p…...

C#怎么实现后台作业调度 C#如何用Quartz.NET配置Cron表达式执行定时调度作业【框架】

Quartz.NET CronTrigger未按时触发的根本原因是时区配置错误和调度器启动时机不当&#xff1b;需显式指定时区、确保Start()在添加所有job/trigger后调用、使用ISchedulerFactory获取调度器、job类须有public无参构造函数且非static或嵌套类。Quartz.NET 的 CronTrigger 为什么…...

【Proteus】:从零开始搭建你的第一个电路仿真项目

1. 认识Proteus&#xff1a;电子工程师的虚拟实验室 第一次打开Proteus时&#xff0c;我就被这个蓝色界面的软件震撼到了——它就像把整个电子实验室搬进了电脑。Proteus不仅仅是一个电路仿真工具&#xff0c;更是电子设计自动化&#xff08;EDA&#xff09;领域的瑞士军刀。从…...

保姆级避坑指南:在Windows上用React Native 0.72.5开发鸿蒙应用(API 13+)

Windows平台React Native鸿蒙应用开发全流程避坑指南 1. 环境配置&#xff1a;从零开始的正确姿势 在Windows系统上搭建React Native鸿蒙开发环境&#xff0c;就像组装一台精密仪器——每个零件都必须严丝合缝。我曾在三个不同配置的Windows 11设备上反复测试&#xff0c;最终…...

SAM 3镜像免配置部署:支持ARM64架构,Jetson Orin Nano边缘设备实测

SAM 3镜像免配置部署&#xff1a;支持ARM64架构&#xff0c;Jetson Orin Nano边缘设备实测 1. 开篇&#xff1a;边缘AI的新选择 如果你正在寻找一个能在边缘设备上运行的图像分割模型&#xff0c;SAM 3绝对值得关注。这个由Facebook推出的统一基础模型&#xff0c;不仅支持图…...

如何通过M9A智能助手自动化管理《重返未来:1999》日常任务

如何通过M9A智能助手自动化管理《重返未来&#xff1a;1999》日常任务 【免费下载链接】M9A 重返未来&#xff1a;1999 小助手 | Assistant For Reverse: 1999 项目地址: https://gitcode.com/gh_mirrors/m9/M9A 还在为《重返未来&#xff1a;1999》中重复的每日任务而烦…...

5步自动化方案:如何高效获取asmr.one平台的音频资源

5步自动化方案&#xff1a;如何高效获取asmr.one平台的音频资源 【免费下载链接】asmr-downloader A tool for download asmr media from asmr.one(Thanks for the asmr.one) 项目地址: https://gitcode.com/gh_mirrors/as/asmr-downloader 你是否曾花费数小时在不同网站…...

QTTabBar多语言配置完整指南:快速实现Windows文件管理器本地化

QTTabBar多语言配置完整指南&#xff1a;快速实现Windows文件管理器本地化 【免费下载链接】qttabbar QTTabBar is a small tool that allows you to use tab multi label function in Windows Explorer. https://www.yuque.com/indiff/qttabbar 项目地址: https://gitcode.c…...

如何用自定义事件监听视频播放器的自定义缓冲状态变化

可通过派发buffering-start/end等自定义事件响应缓冲状态变化&#xff0c;需结合video.buffered、readyState、progress/waiting/playing事件准确判断状态&#xff0c;用CustomEvent传递上下文&#xff0c;并规范监听与解绑。可以通过在视频播放器实例上派发自定义事件&#xf…...

Xournal++:为什么这款开源笔记软件能解决您的学术记录难题

Xournal&#xff1a;为什么这款开源笔记软件能解决您的学术记录难题 【免费下载链接】xournalpp Xournal is a handwriting notetaking software with PDF annotation support. Written in C with GTK3, supporting Linux (e.g. Ubuntu, Debian, Arch, SUSE), macOS and Window…...

SimpleFOC源码学习08(v2.3.2) - 霍尔编码器HallSensor.cpp与HallSensor.h,背后的状态机—6个扇区是怎么驱动 FOC 的?

导言github 源码&#xff1a; https://github.com/simplefoc/Arduino-FOC/blob/v2.3.2/src/sensors/HallSensor.hhttps://github.com/simplefoc/Arduino-FOC/blob/v2.3.2/src/sensors/HallSensor.cpp 在第 8 篇分析了增量式编码器 Encoder 之后&#xff0c;这篇来看另一类在 BL…...

保姆级教程:手把手教你用Node.js + WebSocket搭建自己的WebRTC信令服务器

从零构建WebRTC信令服务器&#xff1a;Node.js实战指南 WebRTC技术已经彻底改变了实时通信的格局&#xff0c;让浏览器之间的点对点音视频传输成为可能。但很多开发者在掌握了getUserMedia和RTCPeerConnection的基本用法后&#xff0c;往往会卡在一个关键环节——如何让两个浏览…...

SimpleFOC源码学习07(v2.3.2) - 增量式编码器Encoder.cpp与Encoder.h,从一对 A、B 信号,到速度、方向、绝对位置的完整解法

导言github 源码&#xff1a; https://github.com/simplefoc/Arduino-FOC/blob/v2.3.2/src/sensors/Encoder.hhttps://github.com/simplefoc/Arduino-FOC/blob/v2.3.2/src/sensors/Encoder.cpp 你有没有在调 FOC 时遇到电机转向和预期相反&#xff0c;或者速度读数在低速时抖个…...

DB2权限管理与操作指南,网友推荐:实用性强,适合数据库管理员参考

DB2权限管理核心命令&#xff1a;GRANT语句用于授权&#xff0c;REVOKE用于收回权限。基本语法&#xff1a;GRANT authority ON object TO user。实例管理员常用db2inst1用户登录&#xff0c;执行db2 connect to sample&#xff0c;然后GRANT DATAACCESS ON DATABASE TO PUBLIC…...

5步掌握AssetStudio:Unity游戏资源提取完整实战手册

5步掌握AssetStudio&#xff1a;Unity游戏资源提取完整实战手册 【免费下载链接】AssetStudio AssetStudio - Based on the archived Perfares AssetStudio, I continue Perfares work to keep AssetStudio up-to-date, with support for new Unity versions and additional im…...

Agent 系列之 ReWOO:从蓝图规划到高效求解的架构革新

1. ReWOO框架的革新性设计 第一次听说ReWOO这个框架时&#xff0c;我正被一个复杂的NLP项目折磨得焦头烂额。当时使用的ReAct框架在处理多步骤推理任务时&#xff0c;不仅响应速度慢&#xff0c;Token消耗更是高得惊人。直到尝试了ReWOO&#xff0c;才发现原来大模型推理还能这…...