Spring Boot整合Apache Shiro实现安全认证与权限控制
1. Apache Shiro与Spring Boot整合概述在Java应用开发中安全机制是不可或缺的核心组件。Apache Shiro作为轻量级安全框架相比Spring Security具有更简单的API和更低的认知成本。我曾在多个生产项目中采用Shiro进行权限控制其简洁的设计哲学让开发团队能够快速上手。Shiro的核心优势在于它将安全操作抽象为四个基础概念认证Authentication、授权Authorization、会话管理Session Management和加密Cryptography。这种清晰的边界划分使得开发者可以按需使用各个模块。例如在最近的一个电商项目中我们仅用两天就完成了从零到生产的权限系统搭建。2. 环境准备与基础配置2.1 依赖管理在Spring Boot项目中引入Shiro需要添加以下核心依赖dependency groupIdorg.apache.shiro/groupId artifactIdshiro-spring-boot-starter/artifactId version1.9.0/version /dependency建议使用starter包而非单独的shiro-core和shiro-spring因为它会自动处理许多配置项。我曾遇到过手动配置时Bean初始化顺序问题starter包完美解决了这个痛点。2.2 基础配置类创建ShiroConfig配置类时需要注意几个关键点Configuration public class ShiroConfig { Bean public SessionManager sessionManager() { DefaultWebSessionManager manager new DefaultWebSessionManager(); manager.setSessionIdUrlRewritingEnabled(false); // 关闭URL重写 return manager; } Bean public DefaultWebSecurityManager securityManager(Realm realm) { DefaultWebSecurityManager manager new DefaultWebSecurityManager(); manager.setRealm(realm); manager.setRememberMeManager(null); // 禁用rememberMe return manager; } }特别提示在生产环境中务必关闭sessionIdUrlRewriting否则可能导致会话固定攻击。我在一次安全审计中就发现过因此导致的中危漏洞。3. 认证与授权实现3.1 自定义Realm开发Realm是Shiro与业务系统对接的桥梁需要重点实现两个方法public class CustomRealm extends AuthorizingRealm { Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) { String username (String) token.getPrincipal(); User user userService.findByUsername(username); if(user null) { throw new UnknownAccountException(用户不存在); } return new SimpleAuthenticationInfo( user, // 身份主体 user.getPassword(), ByteSource.Util.bytes(user.getSalt()), getName() ); } Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { User user (User) principals.getPrimaryPrincipal(); SimpleAuthorizationInfo info new SimpleAuthorizationInfo(); // 添加角色和权限 info.setRoles(roleService.getRoleCodes(user.getId())); info.setStringPermissions(permissionService.getPermissions(user.getId())); return info; } }3.2 密码加密策略Shiro推荐使用HashedCredentialsMatcher进行密码比对Bean public HashedCredentialsMatcher credentialsMatcher() { HashedCredentialsMatcher matcher new HashedCredentialsMatcher(); matcher.setHashAlgorithmName(SHA-256); matcher.setHashIterations(1000); matcher.setStoredCredentialsHexEncoded(false); return matcher; }在用户注册时需要采用相同的算法加密public String encryptPassword(String password, String salt) { return new SimpleHash( SHA-256, password, ByteSource.Util.bytes(salt), 1000 ).toBase64(); }4. 权限控制实战4.1 URL拦截配置ShiroFilterFactoryBean是配置请求拦截的核心Bean public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) { ShiroFilterFactoryBean factory new ShiroFilterFactoryBean(); factory.setSecurityManager(securityManager); MapString, String filterMap new LinkedHashMap(); // 静态资源放行 filterMap.put(/static/**, anon); // 登录接口放行 filterMap.put(/api/login, anon); // 管理员路径需要admin角色 filterMap.put(/admin/**, roles[admin]); // 其他请求需要认证 filterMap.put(/**, authc); factory.setFilterChainDefinitionMap(filterMap); return factory; }4.2 注解式权限控制除了URL配置还可以使用注解RequiresPermissions(user:create) PostMapping(/users) public Result createUser(RequestBody User user) { // 创建用户逻辑 }支持的注解包括RequiresAuthenticationRequiresUserRequiresGuestRequiresRolesRequiresPermissions5. 会话管理与缓存5.1 分布式会话方案在集群环境中需要配置分布式会话Bean public SessionDAO sessionDAO() { RedisSessionDAO dao new RedisSessionDAO(); dao.setRedisManager(redisManager()); dao.setSessionIdGenerator(new JavaUuidSessionIdGenerator()); dao.setExpire(1800); // 30分钟过期 return dao; }5.2 缓存配置权限信息通常需要缓存Bean public CacheManager cacheManager() { RedisCacheManager cacheManager new RedisCacheManager(); cacheManager.setRedisManager(redisManager()); cacheManager.setKeyPrefix(shiro:cache:); return cacheManager; }6. 常见问题排查6.1 认证失败处理在登录控制器中需要处理各种异常PostMapping(/login) public Result login(RequestBody LoginDTO dto) { try { Subject subject SecurityUtils.getSubject(); UsernamePasswordToken token new UsernamePasswordToken( dto.getUsername(), dto.getPassword() ); subject.login(token); return Result.success(); } catch (UnknownAccountException e) { return Result.fail(账号不存在); } catch (IncorrectCredentialsException e) { return Result.fail(密码错误); } catch (LockedAccountException e) { return Result.fail(账号已锁定); } }6.2 权限缓存问题当用户权限变更时需要清除缓存public void clearAuthorizationCache(String username) { SimplePrincipalCollection principals new SimplePrincipalCollection( username, realm.getName() ); AuthorizationCache cache ((AuthorizingRealm)realm).getAuthorizationCache(); if(cache ! null) { cache.remove(principals); } }7. 进阶功能实现7.1 JWT集成对于前后端分离项目可以整合JWTpublic class JwtFilter extends AuthenticatingFilter { Override protected AuthenticationToken createToken( ServletRequest request, ServletResponse response ) { String token getRequestToken(request); return new JwtToken(token); } Override protected boolean onAccessDenied( ServletRequest request, ServletResponse response ) throws Exception { executeLogin(request, response); return true; } }7.2 动态权限控制实现数据库驱动的动态权限Bean public FilterChainDefinitionMap filterChainDefinitionMap() { DynamicFilterChainDefinition chain new DynamicFilterChainDefinition(); chain.addPathDefinition(/**, anon); // 从数据库加载权限配置 ListPermission permissions permissionService.listAll(); permissions.forEach(p - { chain.addPathDefinition( p.getUrl(), perms[ p.getCode() ] ); }); return chain; }8. 性能优化建议8.1 缓存策略优化权限信息建议设置较长的缓存时间如12小时会话信息根据业务需求设置通常30分钟-2小时使用二级缓存内存缓存 Redis缓存8.2 减少授权检查对于频繁访问的接口可以采用白名单机制权限预检查批量权限验证我在处理一个高并发系统时通过预加载用户权限到本地缓存使权限验证速度提升了8倍。

相关新闻

计算机毕业设计之net法院庭审辅助系统的研究与发现

计算机毕业设计之net法院庭审辅助系统的研究与发现

随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&#xf…

2026/8/30 17:19:17 阅读更多 →
SpringBoot+Vue高校固定资产管理系统毕设全流程实战指南

SpringBoot+Vue高校固定资产管理系统毕设全流程实战指南

1. 先搞清楚这个毕设项目到底要做什么 如果你正在为计算机专业的毕业设计发愁,尤其是题目里带着“SpringbootVUE高校固定资产管理系统”这种关键词,那这篇文章就是为你准备的。这不是一个简单的技术堆砌教程,而是帮你理清从选题、开题到最终答…

2026/8/28 17:04:47 阅读更多 →
HarmonyOS7 基础单选项:用 Radio 做好单项选择

HarmonyOS7 基础单选项:用 Radio 做好单项选择

文章目录前言先看这个案例解决什么状态为什么这样设计关键代码拆开看完整代码落地时我会怎么改前言 这组案例开始进入选择类和调节类组件,写业务页面时会经常遇到。这个案例围绕 Radio 基础互斥选择 展开,重点不是把属性背下来,而是弄清楚状…

2026/8/30 16:00:16 阅读更多 →

最新新闻

Delphi数据库结构同步利器:Clever Database Comparer控件详解与应用

Delphi数据库结构同步利器:Clever Database Comparer控件详解与应用

简介:这是一套专为Delphi开发者设计的数据库结构比对与同步工具——Clever Database Comparer v8.2.955.0,兼容Delphi 7至最新版13.1(Florence),面向中高级数据库应用开发人员及DBA,解决多环境数据库Schema…

2026/8/31 0:44:27 阅读更多 →
汇正财经与阿里云签署AI全栈和全场景深化合作协议,共筑智能投顾新生态

汇正财经与阿里云签署AI全栈和全场景深化合作协议,共筑智能投顾新生态

2025年6月5日, 有一家名为汇正财经顾问有限公司, 简称为 “汇正财经” 的公司, 和另一家名为阿里云计算有限公司, 简称为 “阿里云” 的公司, 在杭州云谷园区, 举行了一场AI全栈和全场景深化合作签约仪式。在2023年的时候, 这双方就曾在公共云和安全合规等领域, 首度展开过合作…

2026/8/31 0:43:27 阅读更多 →
裁员--2012IT企业不能不说的故事

裁员--2012IT企业不能不说的故事

就在2012年的时候, 有部分IT企业头顶之上悬着裁员这两个字。诺基亚西门子对外公布, 打算于2013年年底之前进行裁员, 人数达到17000人,这占到了员工总数量的23%, 并且在未来会将移动宽带以及服务当作公司战略重点。在2012年的时候, NEC进行裁员, 裁了1万人, 大约占到该一公司总员…

2026/8/31 0:43:27 阅读更多 →
用Python把足球比赛标题变成结构化数据:统计与可视化实战

用Python把足球比赛标题变成结构化数据:统计与可视化实战

欧洲超级杯巴黎 2-1 维拉,K77 克瓦拉茨赫利亚和杜埃先后破门,登贝莱替补登场送出助攻。这条新闻标题在球迷眼里是比赛结果,在开发者眼里却是一个典型的数据建模场景:比分、进球者、助攻者、替补登场,四个信息分别对应不…

2026/8/31 0:42:26 阅读更多 →
用Python量化电竞社区情绪:从NIP 2:1 WBG看舆情分析

用Python量化电竞社区情绪:从NIP 2:1 WBG看舆情分析

如果你是 LPL 观众,应该已经注意到了这场比赛的话题度:NIP 以 2:1 战胜 WBG 之后,各大电竞社区瞬间热闹起来。这种热度并不奇怪,两支队伍都有一定粉丝基础,比赛过程也很胶着,2:1 的比分本身就意味着“有的聊…

2026/8/31 0:42:26 阅读更多 →
Flume 多租户隔离方案:复杂业务场景下的资源隔离与配额管理

Flume 多租户隔离方案:复杂业务场景下的资源隔离与配额管理

Flume 多租户隔离方案:复杂业务场景下的资源隔离与配额管理1. Flume 多租户场景概述与挑战在大型企业级应用中,常面临多业务系统、多部门共享同一个 Flume 集群的情况,这使得多租户隔离成为必然需求。多租户环境下,Flume 面临的主…

2026/8/31 0:41:26 阅读更多 →

日新闻

MCU无DAC如何用定时器+DMA 2D输出高保真任意波形

MCU无DAC如何用定时器+DMA 2D输出高保真任意波形

接到一个仪表类项目,要在 LAT1189 上输出几种不同波形:正弦、三角、带可调死区的脉冲,频率和幅度都得能实时改。板子上没有 DAC,就一个定时器加几个 DMA 通道。我一开始觉得在定时器中断里改比较寄存器也能应付,后来把…

2026/8/31 0:00:05 阅读更多 →
Cortex-M3 Flash下载失败?从编程错误标志到供电瞬态排查

Cortex-M3 Flash下载失败?从编程错误标志到供电瞬态排查

前两周调试一块带着Cortex-M3内核的板子,IDE里下载固件时突然弹出一行刺眼的错误: error: flash download failed - cortex-m3 。这种报错在嵌入式开发里太常见了,常见到很多人第一反应就是换根数据线、重插一下调试器,但重启三…

2026/8/31 0:00:05 阅读更多 →
STM32 TouchGFX屏幕切换Transition优化:原理、配置与排障实战

STM32 TouchGFX屏幕切换Transition优化:原理、配置与排障实战

做STM32 GUI开发的朋友应该都有体会——界面搭得再漂亮,一旦屏幕切换卡成PPT,整个产品的档次瞬间就没了。早期我在LAT1212这个基于STM32的GUI工程上用TouchGFX做二次开发,最头疼的不是画界面,而是怎么让切换动画既流畅又自然。Tou…

2026/8/31 0:00:05 阅读更多 →

周新闻

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

2026/8/30 0:00:01 阅读更多 →
数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

2026/8/30 0:00:01 阅读更多 →
蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

2026/8/30 0:00:01 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/30 21:10:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/30 18:07:21 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/30 21:10:44 阅读更多 →