您的位置:首页 > 运维架构 > Apache

Apache Shiro Realm

2016-06-28 17:25 393 查看
Realm是一个能够访问应用程序特定的安全数据(如用户、角色及权限)的组件。Realm将应用程序特定的数据转换成一种Shiro能够理解的格式,这样Shiro能够提供一个单一的易理解的Subject编程API,无论有多少数据源存在或你的应用程序特定的数据是怎样的。

Realm通常和数据源是一对一的对应关系,如关系数据库,LDAP目录,文件系统或其他类似资源。因此,Realm接口的实现使用数据源特定的API来展示授权数据(角色、权限等),如JDBC,文件IO,Hibernate或JPA,或其他数据访问API.

Realm实质上就是一个特定安全的DAO。

因为这些数据源大多存储身份验证数据(如密码的凭证)以及授权数据(如角色或权限),每个Shiro
Realm能够执行身份验证和授权操作。

Realm configuration

如果使用Shiro的INI配置文件,你能够自定义及引用Realm,就像在[main]项中的任何其他对象一样,但它们在securityManager中采用两种方法之一进行配置:显式或隐式。

Explicit Assignment

这是一个显式的配置方法,在定义一个或多个Realm后,将它们作为securityManager对象的集合属性。

例如:

fooRealm
= com.turing.foo.Realm

barRealm
= com.turing.another.Realm

bazRealm
= com.turing.baz.Realm

securityManager.realms
= $fooRealm, $barRealm,$bazRealm

显式分配是确定的--你控制具体使用哪一个Realm及它们用于身份验证和授权的顺序。

Realm Authentication

理解了Shiro的主要Authentication工作流后,了解在一个授权尝试中当Authenticator与Realm交互时到底发生了什么是很重要的。

Supporting Authentication Tokens

当在Realm被访问来执行一个授权尝试之前,它的supports方法被调用。如果返回值为true,则它的getAuthenticationInfo(token)方法被调用。

通常realm会检查提交的token的类型(接口或类)来判断它是否能够处理它。

Handling supported Authentication Tokens

若Realm支持一个提交的AuthenticationToken,那么Authenticator将会调用该Realm的getAuthenticationInfo(token)方法。这有效的代表了一个与Realm的后备数据源的授权尝试。该方法按以下步骤进行:

1、为主要的识别信息(账户识别信息)检查token;

2、基于principal在数据源中寻找相吻合的账户数据;

3、确保token支持的creden
4000
tials匹配那些存储在数据源的;

4、若credentials匹配,返回一个封装了Shiro能够理解的账户数据格式的AuthenticationInfo实例。

5、若credentials不匹配,则抛出AuthenticationException异常。

如果credentials匹配给予的principal(s),那么返回一个非空的AuthenticationInfo实例来代表来自于该数据源的Subject账户信息。

SaveTime

直接实现Realm接口可能导致时间消耗及错误。大多数人选择AuthorizingRealm抽象类的子类而不是从头开始。

这个类实现了常用的authentication及authorization工作流来节省你的时间和精力。

Disabling Authentication

如果出于某些原因,你不想用Realm对数据源执行身份验证(也许是由于你只想Realm执行授权),你可以彻底的禁用Realm对身份验证的支持通过从Realm的support方法返回false。然后你的realm在身份验证尝试中永远不会被访问到。

当然,至少需要一个能够支持AuthenticationTokens且已配置的Realm,如果你想验证Subjects.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: