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,他也是一位安全专家。
-
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 。
Shiro 的最大优势在于它的简洁性。与之前出现的安全框架相比,Shiro 提供了一个轻量的安全解决方案,适用于各种类型的 Java 应用。 Shiro 的核心特性包括:
- 独立运行:Shiro 可以独立于 web 容器运行,对 web 环境不存在强依赖。
- 身份验证与授权:提供基于身份验证和角色访问控制 (RBAC) 的安全机制。
- 会话管理:内置持久化机制,支持单点登录 (SSO) 和“记住我”功能。
- 多源聚合:可以从多个数据源聚合安全信息,并提供复合用户视图。
- 事件机制:支持在身份验证、访问控制、会话生命周期中响应事件。
- 方便整合其它框架:Shiro 在架构上的简洁性,让它可以非常方便地与其它框架进行整合,例如 SpringBoot ,Redis 等等。
在 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 ,侵权必究。