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/7/22 17:05:16 阅读更多 →
SpringBoot+Vue高校固定资产管理系统毕设全流程实战指南

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

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

2026/7/22 23:33:48 阅读更多 →
HarmonyOS7 基础单选项:用 Radio 做好单项选择

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

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

2026/7/23 1:34:41 阅读更多 →

最新新闻

PS圆角矩形工具怎么改圆角?矩形单个角做成圆角实操教程

PS圆角矩形工具怎么改圆角?矩形单个角做成圆角实操教程

很多新手使用 PS 绘制矢量矩形时经常遇到两类难题:绘制完成后无法修改圆角大小,或是只能统一调整四个角,不知道如何单独设置某一个角为圆角。本文适配 Photoshop CC2015 及以上全版本,整理 3 套可行方案,覆盖「绘制前预…

2026/7/23 13:28:28 阅读更多 →
新闻播报系统架构设计与实现全解析

新闻播报系统架构设计与实现全解析

1. 新闻播报项目概述 "新闻播报(August 15)"这个项目名称看似简单,实则蕴含了丰富的信息处理需求。作为一个长期从事内容聚合与传播的从业者,我理解这类项目本质上是一个时效性强、内容结构化要求高的信息处理系统。它需要实时抓取、筛选、整理…

2026/7/23 13:28:28 阅读更多 →
易科临EDC,正式开放使用!

易科临EDC,正式开放使用!

做临床研究的老师都明白——数据质量,直接决定研究成果的可信度。但现实往往是:Excel管数据:改了没记录、谁改的不知道、回头查都查不到,答辩时专家一问数据溯源就心虚。纸质CRF(病例报告表)录入&#xff1…

2026/7/23 13:28:28 阅读更多 →
市面上那些服务超棒的谷歌自然排名服务机构揭秘

市面上那些服务超棒的谷歌自然排名服务机构揭秘

在全球化的今天,谷歌自然排名对于企业拓展海外市场至关重要。那么,市面上有哪些服务出色的谷歌自然排名服务机构呢?上海凰启就是其中值得关注的一家。谷歌自然排名的现状与痛点如今,谷歌的算法不断更新。2026年,Google…

2026/7/23 13:28:28 阅读更多 →
Unity安卓打包资源冲突:Gradle构建原理与packagingOptions实战解决方案

Unity安卓打包资源冲突:Gradle构建原理与packagingOptions实战解决方案

1. 项目概述与问题定位如果你正在用Unity开发安卓应用,并且已经走到了打包这一步,那么恭喜你,项目的主体工作基本完成了。但往往就是这临门一脚,会踢到一块铁板——一个让你眉头紧锁的“Build Failed”报错。其中,由bu…

2026/7/23 13:28:28 阅读更多 →
TUSB2XX USB信号中继器选型、配置与PCB布局实战指南

TUSB2XX USB信号中继器选型、配置与PCB布局实战指南

1. 项目概述:为什么我们需要USB信号中继器?在嵌入式系统、个人电脑主板或者工业控制板的设计中,USB接口几乎是标配。但很多工程师都遇到过这样的问题:当USB端口通过一段较长的PCB走线,或者连接了一根质量不佳的线缆后&…

2026/7/23 13:27:28 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 12:54:44 阅读更多 →

月新闻