Shiro 是 JAVA 世界中新近出现的权限框架,较之 JAAS 和 Spring Security,Shiro 在保持强大功能的同时,还在简单性和灵活性方面拥有巨大优势。本文就带领读者一睹 Shiro 的风采。
可能大家早先会见过 J-security,这个是 Shiro 的前身。在 2009 年 3 月初之前,这个安全框架叫做 J-security,由于某些原因,更名为 Shiro(或者 Ki,意为 Fortress),是 Apache 的孵化项目,鉴于本文编写时 Shiro 的还没有正式发布的版本,本文使用的是 Jsecurity 的稳定版本 0.9,本文中 Shiro 等同于 Jsecurity。
本文将涉及 Shiro 的整体框架、安全模型、关键概念类,同时给出了 Shiro 以及 Grails Shiro Plugin 的使用示例,可以下载文中使用的源代码。 本文代码的开发环境:
Jsecurity 0.9 ? Grails 1.2.0
? Grails Shiro Plugin 1.0.1 ? SpringSource Tool Suite 2.3
?
Shiro 是一个强大而灵活的开源安全框架,能够非常清晰的处理认证、授权、管理会话以及密码加密。如下是它所具有的特点:
1. 易于理解的 Java Security API;
2. 简单的身份认证(登录),支持多种数据源(LDAP,JDBC,Kerberos,ActiveDirectory 等);
3. 对角色的简单的签权(访问控制),支持细粒度的签权; 4. 支持一级缓存,以提升应用程序的性能;
5. 内置的基于 POJO 企业会话管理,适用于 Web 以及非 Web 的环境; 6. 异构客户端会话访问; 7. 非常简单的加密 API;
8. 不跟任何的框架或者容器捆绑,可以独立运行。
目前还有其他出现较早的安全框架,比如 JAAS,Spring Security。 JAAS —面世的时间最早,但是鉴于其在使用上有很大的限制,很少有人真正的使用它。可以说它不是一个好的应用程序级别的安全框架;
Spring Security —目前是 Java 安全框架领域当之无愧的老大,已经非常成熟了;如果使用 Spring 框架,可以首选 Spring Security,但是对于单应用来说,Shiro 更显简单方便。
下面就开始我们的 Shiro 之旅吧!
首先,我们来看看的 Shiro 的整体架构,见下图:
第 1 页
图 1. 整体架构
从上图可以看出,Shiro 主要有四个组件: 1. SecurityManager
典型的 Facade,Shiro 通过它对外提供安全管理的各种服务。 2. Authenticator
对“Who are you ?”进行核实。通常涉及用户名和密码。
这个组件负责收集 principals 和 credentials,并将它们提交给应用系统。如果提交的 credentials 跟应用系统中提供的 credentials 吻合,就能够继续访问,否则需要重新提交 principals 和 credentials,或者直接终止访问。 3. Authorizer
身份份验证通过后,由这个组件对登录人员进行访问控制的筛查,比如“who can do what”, 或者“who can do which actions”。Shiro 采
第 2 页
用“基于 Realm”的方法,即用户(又称 Subject)、用户组、角色和 permission 的聚合体。 4. Session Manager
这个组件保证了异构客户端的访问,配置简单。它是基于 POJO/J2SE 的,不跟任何的客户端或者协议绑定。
Shiro 的认证和签权可以通过 JDBC、LDAP 或者 Active Directory 来访问数据库、目录服务器或者 Active Directory 中的人员以及认证 / 签权信息。SessionManager 通过会话 DAO 可以将会话保存在 cache 中,或者固化到数据库或文件系统中。
从 Shiro 的框架图,已经能够体会到这个工具的简单了。下面让我们来看看 Shiro 是如何工作的。先了解一下它的安全模型吧!见下图:
图 2. 安全模型
上图中,涉及了 Shiro 的五个概念:
Subject 是安全领域术语,除了代表人,它还可以是应用。在单应用中,可将其视为 User 的同义词。
? Principal 是 Subject 的标识,一般情况下是唯一标识,比如用户名。 ? Role 和 Permission 分别代表了不同粒度的权限,从上图中可以看出 Role 的粒度更大些,Permission 代表了系统的原子权限,比如数据的修改、删除权限。对于简单的权限应用,可以不需要 Permission。 ? Realm 是一个执行者,负责真正的认证和鉴权。
?
第 3 页