文档库 最新最全的文档下载
当前位置:文档库 › 最新shiro-安全框架

最新shiro-安全框架

最新shiro-安全框架
最新shiro-安全框架

s h i r o-安全框架

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. 整体架构

从上图可以看出,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

采用“基于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 是一个执行者,负责真正的认证和鉴权。

实现应用的安全模块的关键在于:定义合适的 role 和 permission,这就需要遵循如下原则:

1.role 没有实质内容,只是代表一组 permission,目的是为了管理的方

便,一般都是动态定义;

2.permission 一般都是预先定义好的,不允许动态改变,除非源代码改

动,它才会变化,它是整个安全模块的基础;

3.要使 permission 也能动态定义,并非不可能,但是这将使鉴权非常复

杂,甚至可能导致鉴权语句遍布整个程序,得不偿失;

4.当然有一个例外:如果知道 permission 动态定义的规则和鉴权规则,

如 Grails 的 fileter 中

“${controllerName}:${actionName}:${params.id}”也可实现

permission 的动态定义

理解 Shiro 的架构和安全模型了,我们来看看更具体些的内容。下图显示了Shiro 中的关键概念类(参考资料 -- JSecurity Mini Guide)。

图 3. 关键类

相关文档