结合实战,谈谈 Shiro 认证与授权在 Java 项目中的应用?

张开发
2026/5/26 7:17:36 15 分钟阅读
结合实战,谈谈 Shiro 认证与授权在 Java 项目中的应用?
目录前言1、Shiro核心组件Subject主体SecurityManager安全管理器Realm域2、Shiro 内部架构3、核心概念身份与凭证身份Principals凭证Credentials4、认证流程三步验证身份5、认证架构组件协同工作认证组件详解SecurityManagerAuthenticatorRealmAuthenticationStrategy6、授权机制精细化的访问控制三种授权方式对比7、会话管理容器无关的会话控制8、安全漏洞与防御RememberMe反序列化漏洞漏洞修复方案1. 根本性修复2. 临时缓解3. 纵深防御前言Apache Shiro是一个强大而直观的Java安全框架为认证、授权、加密和会话管理提供了一套简洁的API 。它通过清晰的架构设计将复杂的安全逻辑抽象为几个核心组件让开发者能够轻松地为应用程序添加身份验证和访问控制功能。Shiro的设计哲学是“简单而强大”它不依赖于任何容器可以在任何Java环境中运行从简单的命令行应用到大型企业级Web应用都能胜任。与Spring Security相比Shiro的学习曲线更加平缓API设计更加直观这使得它成为许多Java开发者的首选安全框架。1、Shiro核心组件Subject主体应用代码直接交互的对象是Subject 也就是说Shiro的对外API核心就是Subject。Subject代表了当前“用户”这个用户不一定是一个具体的人与当前应用交互的任何东西都是Subject如网络爬虫、机器人等。与Subject的所有交互都会委托给SecurityManagerSubject其实是一个门面SecurityManager才是实际的执行者SecurityManager安全管理器即安全管理器所有与安全有关的操作都会与SecurityManager交互且其管理着所有Subject。可以看出它是Shiro的核心它负责与Shiro的其他组件进行交互它相当于SpringMVC中DispatcherServlet的角色。Realm域连接Shiro与应用程序安全数据的桥梁。负责从数据源如数据库、LDAP获取认证和授权信息。Shiro从Realm获取安全数据如用户、角色、权限就是说SecurityManager要验证用户身份那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法。也需要从Realm得到用户相应的角色/权限进行验证用户是否能进行操作。可以把Realm看成DataSource。2、Shiro 内部架构Subject任何可以与应用交互的“用户”。SecurityManagerShiro 的核心所有具体的交互都通过 SecurityManager 进行控制它管理着所有 Subject、且负责进行认证、授权、会话及缓存的管理。Authenticator负责 Subject 认证是一个扩展点可以自定义实现可以使用认证策略Authentication Strategy即什么情况下判定用户认证通过。Authorizer授权器、即访问控制器用来决定主体是否有权限进行相应的操作即控制着用户能访问应用中的哪些功能Realm可以有 1 个或多个 Realm可以认为为安全实体数据源用于获取安全实体可以是 JDBC 实现也可以是内存实现等等由用户提供所以一般在应用中都需要实现自己的 RealmSessionManager管理Session声明周期的组件通过Shiro框架的这一模块开发者可在任何应用或架构层一致地使用Session APICacheManager缓存控制器来管理如用户、角色、权限等的缓存的因为这些数据基本上很少改变放到缓存中后可以提高访问的性能Cryptography密码模块提供了一些常见的加密组件用于如密码加密/解密。3、核心概念身份与凭证在Shiro的世界里一切安全操作都围绕主体Subject展开它代表当前与应用交互的“用户”。每个主体都通过身份Principals和凭证Credentials来证明自己是谁。身份Principals主体的标识属性可以是用户名、邮箱、用户ID等任何能够唯一标识用户的属性。Shiro支持多个身份但通常会指定一个主要身份Primary Principal作为应用内的唯一标识。凭证Credentials证明身份所有权的秘密信息最常见的组合就是用户名/密码。其他凭证类型还包括生物特征指纹、视网膜扫描和数字证书等。4、认证流程三步验证身份认证是验证用户身份的过程Shiro将其抽象为清晰的三个步骤确保用户身份的合法性。当用户调用subject.login(token)时背后发生了复杂的交互过程第一步委托认证- Subject将认证请求委托给SecurityManager第二步策略执行- SecurityManager委托给Authenticator根据配置的认证策略调用Realm第三步数据验证- Realm检查提交的token从数据源验证用户身份第四步状态管理- 认证成功后用户信息存储在Subject的会话中// Shiro认证核心代码示例 Subject currentUser SecurityUtils.getSubject(); UsernamePasswordToken token new UsernamePasswordToken(zhang, 123); token.setRememberMe(true); try { currentUser.login(token); System.out.println(登录成功!); } catch (UnknownAccountException uae) { System.out.println(用户名不存在!); } catch (IncorrectCredentialsException ice) { System.out.println(密码错误!); } catch (LockedAccountException lae) { System.out.println(账户已锁定!); } catch (AuthenticationException ae) { System.out.println(认证失败: ae.getMessage()); }5、认证架构组件协同工作当调用Subject.login()时Shiro内部会启动一个精密的认证序列多个组件协同完成身份验证。认证组件详解SecurityManager安全管理的核心作为保护伞组件接收认证请求并委托给Authenticator处理。Authenticator认证管理器默认使用ModularRealmAuthenticator支持单Realm或多Realm认证策略。Realm安全数据源负责从数据库、LDAP等存储中获取用户身份和凭证信息进行比对。AuthenticationStrategy认证策略在多Realm环境下协调认证过程决定整体认证成功条件。6、授权机制精细化的访问控制授权是控制“用户能做什么”的过程Shiro提供了三种灵活的授权方式满足不同场景的需求。三种授权方式对比授权方式实现机制适用场景基于角色检查用户是否拥有特定角色简单的角色控制场景基于权限检查用户是否拥有特定权限精细化的权限控制基于注解在方法上使用注解声明权限Spring集成场景Shiro使用权限字符串来表示权限格式为资源类型:操作:资源实例ID支持通配符匹配提供了极大的灵活性。// 授权检查API示例 Subject currentUser SecurityUtils.getSubject(); // 基于角色的访问控制 if (currentUser.hasRole(admin)) { // 有admin角色 } // 基于权限的访问控制 if (currentUser.isPermitted(user:create)) { // 有创建用户的权限 } // 检查多个权限 boolean[] permitted currentUser.isPermitted(user:create, user:delete); // 基于实例的权限检查 if (currentUser.isPermitted(user:update:1)) { // 有更新ID为1的用户的权限 }7、会话管理容器无关的会话控制Shiro提供了完整的企业级会话管理功能最大的特点是容器无关性——可以在任何环境使用相同的API不依赖于Web容器的session实现。会话管理的核心特性包括统一API- 使用类似HttpSession的API学习成本低多种存储- 支持内存、文件、数据库、Redis等多种存储方式集群支持- 可配置分布式会话管理适合微服务架构会话监听- 提供会话监听器监控会话生命周期事件8、安全漏洞与防御RememberMe反序列化漏洞Shiro历史上曾存在著名的RememberMe反序列化漏洞CVE-2016-4437这是一个高危的远程代码执行漏洞CVSS评分高达9.8分。漏洞的核心问题在于两点首先Shiro早期版本使用了硬编码的默认AES密钥攻击者可以直接获取其次解密后的数据直接进行反序列化操作缺乏必要的安全校验。漏洞修复方案1. 根本性修复升级Shiro版本并配置强密钥。AES-128至少16字节AES-192至少24字节AES-256至少32字节。2. 临时缓解禁用RememberMe功能、实施反序列化过滤、替换反序列化组件为Jackson等更安全的方案。3. 纵深防御代码层面避免漏洞依赖、网络层面配置WAF规则、运维层面建立配置审计流程。 技术成长没有捷径但每一次的阅读、思考和实践都在默默缩短您与成功的距离。 如果本文对您有所启发欢迎点赞、收藏、分享给更多需要的伙伴️ 期待在评论区看到您的想法、疑问或建议我会认真回复让我们共同探讨、一起进步 关注我持续获取更多干货内容 我们下篇文章见

更多文章