shiro实战系列(十四)之配置
Shiro 被设计成能够在任何环境下工作,从最简单的命令行应用程序到最大的的企业群集应用。由于环境的多样性,使得许多配置机制适用于它的配置。
一、 许多配置选项
Shiro的SecurityManager实现及所支持的组件都是兼容JavaBean的。这使得Shiro几乎能使用任何配置格式,如regular Java,XML(Spring, JBoss, Guice,等等),YAML,JSON,Groovy Builder markup,以及更多的配置。
二、 可编程配置
创建一个 SecurityManger 并把它提供给应用程序的绝对的最简单的方法是创建一个 org.apache.shiro.mgt.DefaultSecurityManager 并把它链到代码中。

三、 安全管理器对象图
Shiro 的 SecurityManager 实现实质上是一个特定安全的嵌套组件中的模块化对象图。因为它们也是兼容 JavaBean 的,你可以调用任何嵌套组件的 getter 和 setter 方法来配置 SecurityManager 以及它的内部对象图。
例如,如果你想配置 SecurityManager 实例来使用自定义的 SessionDAO 来定制 Session Management,你可以通过嵌 套的 SessionManager 的 setSessionDAO 方法直接设置 SessionDAO:

通过使用直接方法调用,你可以配置 SecurityManager 的对象图的任何部分。
但是,程式化定制过于简单,它并不能代表大多数现实世界的应用程序的理想配置。以下是程式化定制可能不适合 你的几点原因:  它需要你了解和实例化一个直接实现。这将会更好,如果你不需要了解具体的实现和在哪里可以找到它们。  由于 Java 的类型安全性,你需要转换通过 get*方法获取的对象来得到它们具体的实现。如此多的转换是丑陋 的,冗长的,并使你和实现类紧密连接起来。
SecurityUtils.setSecurityManager 方法调用在一个 VM 静态单例中实例化 SecurityManager 实例,VM 静态单例 在给许多应用程序带来好处的同时,也会引发一些问题,如果多个启用 Shiro 的应用程序在同一个 JVM 中运行。如果该实例是一个应用程序单例,而不是一个静态内存引用就再好不过了。  每当你想改变 Shiro 配置时,它需要你重新编译你的应用程序。 然而,即使有这么多警告,直接的编程操作方法在内存受限的环境中仍然是有价值的,如智能手机应用。若你的应用程序不在一个内存受限的环境下运行,你会发现基于文本的配置要更容易使用和阅读。
四、 ini配置
大多数应用程序反而从基于文本的配置受益,能够独立地修改源代码,甚至让那些不熟悉 Shiro 的 API 的人能够更 容易理解。
为了确保一个基于文本的通用标准配置机制能够在所有环境下以最小的第三方依赖工作,Shiro 支持 INI 格式来构建 SecurityManager 对象图及其支持的组件。INI 易于阅读,易于配置,且设置简单,适合大多数应用程序。
(1) 来自ini实例的安全管理器
如果你需要,INI 配置也可以通过 org.apache.shiro.config.Ini 类使用编程方式创建。Ini 类的功能与 JDK java.util.Properties 类相似,但通过 section 名称,它同时还支持分割。

现在,我们知道如何从 INI 配置构建出一个 SecurityManager 了,我们看看到底是如何定义一个 Shiro INI 配置的。
(2) INI Sections
INI 基本上是一个文本配置,包含了由唯一命名的 section 组织的键/值对。键只是每个 section 唯一,而不是在整个 配置中(与 JDK 属性不同)。不过每个 section 都可以被看作单一的属性定义。 注释行能够以散列字符(# - 也就是"hash","pound"或"number"符号)或分号(";")开始。
以下就是shiro能够理解section的例子:

[main]
[main] section 是你配置应用程序的 SecurityManager 实例及任何它的依赖组件(如 Realms)的地方。 配置对象实例,如 SecurityManager 或任何它的依赖组件,通过使用 INI 听起来是一件困难的事情,我们仅能使用名 称/值对。但通过一点点约定和对对象图的理解,你将会发现你可以做很多事情。Shiro 使用这些条件来简单却相当 简洁的配置机制。 我们往往喜欢把这种方法称为“穷人的”依赖注入,虽然没有完全成熟的 Spring/Guice/JBoss XML 文件强大,但你将 会发现它能够完成许多事情却没有太多的复杂性。当然那些其他的配置机制也同样可用,但它们不是使用 Shiro 所 必需的。
为了激起你的欲望,这里有一个有效的[main]配置的例子。我们将在下面讨论它的细节,但你可能会发现,仅凭直 觉就能明白很多事情是怎么回事:


这一行实例化了 com.company.shiro.realm.MyRealm 类型的新的对象实例,并使该对象使用 myRealm 名称,以供进 一步的引用和配置。 如果该实例化的对象实现了 org.apache.shiro.util.Nameable 接口,则 Nameable.setName 方法将会在拥有该名字(在 本例中是 myRealm)的对象上调用。
注意:
每个对象的实例化以及每个值得分配都是按照它们在[main] section 中出现的顺序来执行的。这些配置行最终转化成 一个 JavaBean 的 getter/setter 方法调用,因此,这些方法以同样的顺序被调用! 当你编写你的配置时,请记住这点。
[users]
[users] section 允许你定义一组静态的用户帐户。这在大部分拥有少数用户帐户或用户帐户不需要在运行时被动态地 创建的环境下是很有用的。以下是一个例子:
a.Automatic IniRealm :
仅定义非空的[users]或[roles] section 将会自动地触发 org.apache.shiro.realm.text.IniRealm 实例的创建,并使它在 [main] section 中可用且名为 iniRealm。你可以像上面所描述的其他对象一样来配置它。
b.Line Format
在[users] section 中的每行都必须保证是下面的格式:
username = password, roleName1, roleName2, …, roleNameN 
在等号左边的值是用户名。
在等号右边的第一个值是用户的密码,密码是必须的。 
任何在密码后用逗号分隔的值都是分配给该用户的角色名。角色名是可选的。
c.Encrypting Passwords
如果你不想[users] section 中密码是纯文本的,你可以使用你喜爱的散列算法(MD5,Sha1,Sha256,等等)来进行加密,并使用生产的字符串作为密码值。默认情况下,密码字符串是 16 进制编码,但可以使用 Base64 编码代替 16 进制编码来配置(见下面)。
一旦你指定了文本密码散列值,你得告诉 Shiro 这些都是加密的。你可以通过配置在[main] section 中隐式地创建 iniRealm 来使用合适的 CredentialsMatcher 实现来对应到你所指定的哈希算法:

你可以像任何其他对象一样在 CredentialsMatcher 上配置任何属性,以反映你哈希策略,例如,指定 salting 是否被使用或需要执行多少次哈希迭代。请参见 org.apache.shiro.authc.credential.HashedCredentialsMatcher 的 JavaDoc 来更好的理解哈希策略,如果它们对你可能有用的话。
例如,如果你的用户密码字符串是 Base64 编码而不是默认的 16 进制,你可以指定说明:

[roles]
[roles] section 允许你把定义在[users] section 中的角色与权限关联起来。另外,这在大部分拥有少数用户帐户或用户 帐户不需要在运行时被动态地创建的环境下是很有用的。以下是一个例子:

Line Format
在[roles] section 中每个配置行必须定义一个映射以下格式的角色到权限的键/值: rolename = permissionDefinition1, permissionDefinition2, … , permissionDefinitionN permissionDefinition 是一个任意的字符串,但大多数人将会使用符合 org.apache.shiro.authz.permission.WildcardPermission 格式的字符串,为了易用性和灵活性。请参见 Permissions 文档 获取更多关于 Permissions 及你如何从它们受益的信息。
Internal commas
请注意,如果一个独立的 permissionDefinition 需要被内部逗号分隔(例如,printer:5thFloor:print,info),你需要用户双引号环绕该定义,以避免错误解析: "printer:5thFloor:print,info"
Roles without Permissions
如果你有不需要权限关联的角色,你不需要在[roles] section 中间把他们列出来,如果你不想的话。只需定义在[user] section 中定义角色名就足以创建尚不存在的角色。
shiro实战系列(十四)之配置的更多相关文章
- MP实战系列(十四)之分页使用
		
MyBatis Plus的分页,有插件式的,也有其自带了,插件需要配置,说麻烦也不是特别麻烦,不过觉得现有的MyBatis Plus足以解决,就懒得配置插件了. MyBatis Plus的资料不算是太 ...
 - shiro实战系列(十五)之Spring集成Shiro
		
Shiro 的 JavaBean 兼容性使得它非常适合通过 Spring XML 或其他基于 Spring 的配置机制.Shiro 应用程序需要一个具 有单例 SecurityManager 实例的应 ...
 - shiro实战系列(十二)之常用专业术语
		
请花 2 分钟来阅读和理解它——这很重要.真的.这里的术语和概念在文档的任何地方都被涉及到,它将在总体上 大大简化你对 Shiro 和安全的理解. 由于所使用的术语使得安全可能令人困惑.我们将通过 ...
 - shiro实战系列(十)之Subject
		
毫无疑问,在 Apache Shiro 中最重要的概念就是 Subject.'Subject'仅仅是一个安全术语,是指应用程序用户的特定 安全的“视图”.一个 Shiro Subject 实例代表了一 ...
 - AspNetCore-MVC实战系列(四)之结尾
		
AspNetCore - MVC实战系列目录 . 爱留图网站诞生 . git源码:https://github.com/shenniubuxing3/LovePicture.Web . AspNetC ...
 - struts2官方 中文教程 系列十四:主题Theme
		
介绍 当您使用一个Struts 2标签时,例如 <s:select ..../> 在您的web页面中,Struts 2框架会生成HTML,它会显示外观并控制select控件的布局.样式和 ...
 - shiro实战系列(一)之入门实战
		
一.什么是shiro? Apache Shiro 是一个强大而灵活的开源安全框架,它干净利落地处理身份认证,授权,企业会话管理和加密. Apache Shiro 的首要目标是易于使用和理解.安全有 ...
 - 闯祸了,生成环境执行了DDL操作《死磕MySQL系列 十四》
		
由于业务随着时间不停的改变,起初的表结构设计已经满足不了如今的需求,这时你是不是想那就加字段呗!加字段也是个艺术活,接下来由本文的主人咔咔给你吹. 试想一下这个场景 事务A在执行一个非常大的查询 事务 ...
 - shiro实战系列(八)之安全管理器
		
Apache Shiro 提供安全框架界独一无二的东西:一个完整的企业级 Session 解决方案,从最简单的命令行及智能手机 应用到最大的集群企业 Web 应用程序. 这对许多应用有着很大的影响 ...
 
随机推荐
- 【Java基础】5、java中的匿名内部类
			
匿名内部类也就是没有名字的内部类 正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写 但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口 实例1:使用匿名内部类来实现抽象方 ...
 - 码云创建maven工程
			
码云创建maven工程步骤 1.现在码云上创建工程2.拉取到本地3.使用"touch .gitignore"命令创建.gitignore文件4.在文件中添加过滤文件: .setti ...
 - Contest2071 - 湖南多校对抗赛(2015.03.28)
			
Contest2071 - 湖南多校对抗赛(2015.03.28) 本次比赛试题由湖南大学ACM校队原创 http://acm.csu.edu.cn/OnlineJudge/contest.php?c ...
 - vue 数据请求
			
作者QQ:1095737364 QQ群:123300273 欢迎加入! 要引入模块: vue-resource 1.在package.json中的dependencies中添加vue ...
 - 08:Vigenère密码
			
08:Vigenère密码 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 16世纪法国外交家Blaise de Vigenère设计了一种多表密码加密算法— ...
 - 从零开始学习html(十三) CSS代码缩写,占用更少的带宽
			
一.盒模型代码简写 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type&quo ...
 - KCF跟踪算法 入门详解
			
一.算法介绍 KCF全称为Kernel Correlation Filter 核相关滤波算法.是在2014年由Joao F. Henriques, Rui Caseiro, Pedro Martins ...
 - webpack打包vue项目之后生成的dist文件该怎么启动运行
			
亲测,webpack打包vue项目之后生成的dist文件可以部署到 express 服务器上运行. 我的vue项目结构如下: 1. 进入该vue项目目录,打开git bash,执行:npm run b ...
 - Android--监听View的两个指头是放大和缩小
			
private double nLenStart = 0;//监听 WebView所用手势 @Override public boolean onTouch(View v, MotionEvent e ...
 - Laravel安装教程
			
1.Call to undefined function Illuminate\Encryption\openssl_cipher_iv_length() 报这个错是因为Apache/bin目录下 l ...