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.
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.
相关文章推荐
- 【报错】ClassNotFoundException 之 collections.map.LRUMap
- ubuntu 安装apache2并配置cgi,搭建mimetex转化公式图片的服务
- Apache ActiveMQ教程
- javaweb学习总结(四十一)——Apache的DBUtils框架学习
- Error:(5, 30) java: 程序包org.apache.http.client不存在
- Apache参数KeepAlive该如何配置
- Apache开启PathInfo
- Apache中压力测试工具ab的操作说明
- ApacheBench(ab)使用详解
- (3)Apache
- Apache TraceEnable关闭与测试方法
- apache commons (email,configuration)学习
- 关闭或者开启apache的目录浏览
- Apache Avro使用入门指南
- maven编译不通过:软件包com.sun.org.apache.xml.internal.security.utils.Base64 不存在
- Apache Solr入门教程(初学者之旅)
- hive12启动报错org.apache.thrift.server.TThreadPoolServer.<init>(Lorg/apache/thrift/server/TThreadPoolServer$Args;)
- Apache ab压力测试时出现大量的错误原因分析
- 架构设计:系统间通信(37)——Apache Camel快速入门(中)
- Linux Apache绑定多域名