1.Shiro 的发展历程
1.1 背景
2004 年是一个万马奔腾的年代。千禧年的互联网泡沫刚刚消散,新的技术浪潮正在酝酿。那一年,淘宝成立才一年,Google 刚刚度过五岁生日,而 Java 语言则迎来了它的十周年。那一年,整个 Java 生态飞速发展,各种工具和框架如雨后春笋般涌现,安全领域也不例外。
当时,Java 开发者们主要使用的是 JAAS 和 EJB 作为安全框架。这是两个非常古老的框架,现代 Java 开发者可能很少听过它们的名字。不过,在当年,安全方面的框架不多,开发者们并没有太多的选择。JAAS 和 EJB 这两个框架的设计都非常复杂,学习门槛很高,并且缺乏许多常用的安全功能。例如,无法在运行时动态修改用户权限、缺少统一的 Session 管理机制,等等。总之,用起来非常不爽,而且 bug 也很多。作为软件安全领域的专家, Les Hazlewood 对当时的状况感到非常不满,他决定自己开发一款 Java 安全框架,他给新框架定下的核心目标是:轻量、灵活、易于使用。
Les Hazlewood 是美国人,曾经是 Stormpath 的联合创始人,这是一家专注于身份管理的公司,后来被 Okta 公司收购。 Hazlewood 的职业生涯一直专注于软件安全和身份管理领域,他曾为 Spring 和 JBoss 项目贡献过代码。 Hazlewood 最著名的成就是创建了 Shiro 框架,另一位联合创始人是 Jeremy Haile,他也是一位安全专家。
1.2 关键历程
2004 年,第一个版本发布,刚开始叫做 JSecurity 。
2008 年,JSecurity 加入 Apache 基金会,逐渐开始流行起来。
2009 年,因为商标问题被迫改名为 Apache Shiro 。Shiro 一词读作 /ˈʃiːroʊ/ ,汉语拼音:xi rou ,这个词来自于日语,字面含义是“城堡”。这个名字非常贴切:城堡象征一块需要安全保护的领域,只有经过身份验证的人才能进入这个领域,进入后也需要经过授权才能执行特定操作。
2010 年,Shiro 成为 Apache 基金会的顶级开源项目,此时距离第一个版本的发布已经过去了 6 年时间。
2013 年,Shiro 1.2 版本发布,新增了与 Web 环境集成的功能,增强了对 RESTful 服务的支持,并改进了权限管理和缓存功能。
2016 年,Shiro 1.3 发布,改进了加密功能,支持更现代的加密算法,同时加强了对并发访问的支持,并修复了若干安全漏洞。
2017 年,Shiro 1.4 发布,主要改进了 Spring 集成,并推出了一个独立的 JAR 包,名为 shiro-spring,支持异步认证和授权,增强了对微服务架构的支持,并新增对 CSRF 攻击的防护。
2019 年,Shiro 1.5 发布,增强了与现代 Java 版本(如 Java 11 和 Java 12)的兼容性,进一步优化了性能,并添加了更多的安全特性。
2020 年,Shiro 1.6 发布,重点改进了安全策略,并提升了集成和配置的灵活性。
2021 年,Shiro 1.7 发布,进一步增强了与 Spring 的集成能力,并对各种潜在的安全问题进行了修复和优化。
2022 年,Shiro 1.8 发布,增加了对 OAuth2 的支持,优化了 JWT 认证机制,并进一步提升了性能和安全性。
2023 年,Shiro 1.9 发布,改进了对现代化应用的适配能力,进一步简化了配置过程,并增强了与云原生环境的集成。
2024 年,Shiro 1.10 发布,重点强化了分布式环境下的安全特性,提供了更丰富的授权策略和动态权限管理功能。
自从 2008 年加入 Apache 基金会开始,Shiro 一直是 Java 领域最著名的安全框架之一,它在社区的影响力一直持续到今天。目前,Shiro 依然在 github 上持续更新代码,项目链接在: https://github.com/apache/shiro 。
1.3 核心特性
Shiro 的最大优势在于它的简洁性。与之前出现的安全框架相比,Shiro 提供了一个轻量的安全解决方案,适用于各种类型的 Java 应用。 Shiro 的核心特性包括:
- 独立运行:Shiro 可以独立于 web 容器运行,对 web 环境不存在强依赖。
- 身份验证与授权:提供基于身份验证和角色访问控制 (RBAC) 的安全机制。
- 会话管理:内置持久化机制,支持单点登录 (SSO) 和“记住我”功能。
- 多源聚合:可以从多个数据源聚合安全信息,并提供复合用户视图。
- 事件机制:支持在身份验证、访问控制、会话生命周期中响应事件。
- 方便整合其它框架:Shiro 在架构上的简洁性,让它可以非常方便地与其它框架进行整合,例如 SpringBoot ,Redis 等等。
1.4 Shiro 与 SpringSecurity 对比
在 Java 领域,有很多安全相关的框架,其中 Apache Shiro 和 SpringSecurity 是流行程度最高的两种,我们来做一个简单的对比:
对比项 | Apache Shiro | Spring Security |
---|---|---|
首次发布时间 | 2004 年 | 开始于 2003 年,最初名为 Acegi 。这个项目最初功能非常简陋,而且很不好用。2007 年改名为 Spring Security ,融入 Spring 技术体系。 |
设计理念 | 轻量级,注重简洁性,易于使用,专注于认证、授权、会话管理和加密等基础功能。 | 深度集成 Spring 框架,功能全面,模块化设计,适合复杂的企业级应用。 |
认证与授权 | 使用 Realm 处理认证与授权,支持自定义认证源,提供简单灵活的基于角色和权限的控制。 |
提供多种认证机制,支持复杂的基于角色、权限、表达式的授权规则,适合高级配置需求。 |
会话管理 | 自带会话管理功能,支持分布式会话,尤其适合非 Web 环境。 | 通常依赖于 Spring Session 或 Web 容器的会话管理,适合 Web 环境使用。 |
加密与密码管理 | 提供基础的加密和密码管理 API,支持常见的哈希算法如 MD5 和 SHA-256。 | 提供更强的密码管理和加密支持,如 BCrypt 、SCrypt 等现代加密算法。 |
配置方式 | 配置相对简单,可通过 XML 或 Java 代码进行配置,适用于独立于 Spring 的项目。 | 基于注解或 XML 配置,集成度高,支持 Spring Boot 自动配置,但配置相对复杂。 |
扩展性 | 功能相对单一,扩展性有限,适合中小型项目或需要轻量级安全框架的应用。 | 扩展性强大,支持 OAuth2、JWT、SAML 等现代安全协议,适合大型复杂项目。 |
社区与支持 | 社区规模较小,文档和插件支持相对较少。 | 拥有活跃的社区,文档丰富,支持最新的安全标准和协议,插件与扩展工具众多。 |
适用场景 | 适合中小型、独立于 Spring 框架的项目,或不需要复杂安全机制的应用场景。 | 适合企业级、基于 Spring 的复杂应用,尤其是在 Web 和微服务架构中表现优异。 |
学习曲线 | 学习曲线较平缓,容易上手,适合快速实现基础的安全需求。 | 学习曲线较陡,功能复杂,适合有复杂安全需求的高级用户或大型项目。 |
整体来看,Apache Shiro 以轻量、简单著称,适合中小型应用或独立于 Spring 框架的项目。而 Spring Security 则功能更加全面,扩展性强,尤其适合复杂的企业级应用,特别是那些基于 Spring 框架的项目。
从学习的角度来说,阅读 Apache Shiro 的源代码是一个不错的选择。它的概念清晰,设计简洁,能够帮助开发者更好地理解安全框架的基本原理和实现方式。
资源链接
- Apache Shiro 在 github 上的官方仓库:https://github.com/apache/shiro
- Apache Shiro 官方网站:https://shiro.apache.org/
- 本书实例项目:https://gitee.com/mumu-osc/nicefish-spring-boot
- 本书文字稿:https://gitee.com/mumu-osc/apache-shiro-source-code-explaination
版权声明
本书基于 CC BY-NC-ND 4.0 许可协议发布,自由转载-非商用-非衍生-保持署名。
版权归大漠穷秋所有 © 2024 ,侵权必究。