日期:2014-05-16  浏览次数:20696 次

Apache Shiro 授权概念

授权即是访问控制,是对资源访问管理过程。它将判断用户在应用程序中是否对资源有相应的访问权限。比如:判断一个用户有查看页面的权限,编辑数据的权限,拥有某一按钮的权限,以及是否拥有打印的权限等等。


授权有三个核心元素:权限,角色和用户。

1 权限

Apache Shiro中权限是安全机制中最核心的元素。它在应用程序中明确地声明了被允许的行为,一个格式良好的权限声明可以清晰地表达出用户与资源交互时拥有的权限。

权限声明的一些例子:

l 打开一个文件;

l 查看'/user/list'网页;

l 打印文档;

l 删除用户'jsmith'

大多数资源都支持典型的CRUD(创建,读取,更新,删除)操作,但任何对特定资源有意义的行为都是可以的。最小的权限声明是基于资源和行为的。

这里最重要的认识是权限声明没有谁可以执行此行为,许可声明仅能够反映行为(与资源类型相关的行为)。它们不反映是谁能够执行这样的行为。

定义用户被允许做什么(权限),是一种以某种方式给用户分配权限的操作。这是由应用程序自己决定的,通常在不同的应用程序间变化很大。比较常见的方法有将权限集合到一个角色中,然后将角色与一个或多个用户对象相关联。或者某些应用程序可以有一组可以被分配一个角色的用户组,建立的关联意味着该组中的所有用户都隐式地获得了该角色的权限。如何授予用户权限可以有很多变化——应用程序决定如何基于应用的要求来建模。

2 角色

角色是一个命名的实体,通常代表一组行为或职责。这些行为演化为你在一个应用系统中能或者不能做的事情。角色通常是分配给用户的,因此,通过分配用户能够“做”的事情可以归属于各种角色。

Shiro中支持两种类型的角色:

1、 隐式角色

传统的方式,一个角色代表着一系列的操作,当需要对某一操作进行授权验证时,只需判断是否是该角色即可。行为已被一个单独的名字所蕴含。这种角色权限相对简单、模糊,不利于扩展。,隐式角色可能会增加许多软件的维护和管理问题。

2、 显式角色

一个显式角色本质上是一个授权声明的命名集合。授权验证时,需要判断当前角色是否拥有该权限。这种角色权限可以对该角色进行详细的权限描述,适合更复杂的权限设计。Shiro 团队提倡使用权限和显式角色,而不是陈旧的隐式方法。

3 用户

用户实质上是指与应用程序有关的人。Subject Shiro 中“用户”的概念。

允许用户(Subjects)在你的应用程序中执行某些操作,是通过让他们与角色相关联或是直接授予权限。你的应用程序的数据模型定义了Subject 是如何被允许做某事或不允许做某事的。

例如,在你的数据模型中,你有一个实际的User 类,在授权时你可以直接分配权限给User 实例。或者,你只分配权限给角色,然后分配角色给用户,通过关联,让用户“延伸”地拥有某个权限。或者你用"Group"的概念来代替这些东西。这些都随便你——根据你自己的应用程序来定义。

你自己的数据模型定义授权究竟是如何工作的。Shiro 依靠Realm 来实现转换你的数据模型,使其细节关联到一种Shiro 能够理解的格式。