第三章:Shiro的配置

Shiro配置基础知识

Shiro 被设计成能够在任何环境下工作,从最简单的命令行应用程序到最大的的企业群集应用。由于环境的多样性,使得许多配置机制适用于它的配置。

兼容JavaBean格式的

Shiro的SecurityManager 实现及所支持的组件都是兼容JavaBean 的。这使得Shiro几乎能使用任何配置格式,如regular Java,XML(Spring, JBoss, Guice,等等),YAML,JSON,Groovy Builder markup,以及更多的配置。

程序配置的方式

n创建SecurityManger示例

Realm r = new IniRealm();

DefaultSecurityManager s = new DefaultSecurityManager(r);

SecurityUtils.setSecurityManager(s);

SecurityUtils.setSecurityManager 方法调用在一个VM 静态单例中实例化SecurityManager 实例

nSecurityManger的对象图

SecurityManager 实现实质上是一个特定安全的嵌套组件中的模块化

对象图。因为它们也是兼容JavaBean 的,你可以调用任何嵌套组件的getter 和setter 方法来配置SecurityManager以及它的内部对象图。

例如,如果你想配置SecurityManager 实例来使用自定义的SessionDAO 来定制Session Management,你可以通过嵌套的SessionManager 的setSessionDAO 方法直接设置SessionDAO:

SessionDAO sessionDAO = new MySessionDAO();

((DefaultSessionManager)s.getSessionManager()).setSessionDAO(sessionDAO);

ini配置的方式

nIni配置

INI基本上是一个文本配置,包含了由唯一命名的项来 组织的键/值对。键只是每个项 唯一,而不是在整个配置中(与JDK 属性不同)

Ini配置示例:

n[main]

配置应用程序的SecurityManager 实例及任何它的依赖组件(如Realms)的地方,示例如:

上述示例包括了:

1:定义对象

2:设置对象属性,如果是原始类型的值,就直接设置;如果是引用类型的值,就是用$+名称的方式来设置

3:可以使用遍历对象图的方式来设置数据

n对于Byte Array的值

因为原始的字节数组本身不能使用文本格式,所以我们必须使用文本编码的字节数组。能够指定的值是一个Base64编码的字符串(默认),后一个16 进制编码的字符串。默认是Base64 是因为Base64 编码只需较少的文本来表示值——它拥有一个较大的编码表,意味着你的token 都是较短的。如:

如果你喜欢使用16 进制编码,你必须在字符串token 前加上0x("zero" "x")前缀

对于Collection的值

对于Set 和list 而言,只需指定一组由逗号分隔的值或对象的引用。如:

对于Map,你指定一系列由逗号分隔的键-值对,每个键-值对通过冒号“:”被限定:

n注意

1:顺序问题:

INI 格式和约定都非常便捷且易于理解,但它没有其他基于text/XML 的配置机制强大。在使用上面的机制时最重要的问题是理解顺序问题,请记住:

每个对象的实例化以及每个值的分配都是按照它们在[main] section中出现的顺序来执行的。这些配置行最终转化成一个JavaBean 的getter/setter 方法调用,因此,这些方法以同样的顺序被调用!

2:实例覆盖的问题

任何对象能够被配置中后来新定义的实例覆盖。如下

这将导致myRealm成为一个com.company.security.DatebaseRealm实例,且之前的实例将永不会被使用(同时被垃圾回收)

n注意

3:缺省的SecurityManage:

你可能已经注意到在上面的示例中,SecurityManager 实例的类并没有定义,我们仅在右边设定一个嵌套属性:

这是因为securityManager实例是一个特殊的实例——它已经为你实例化并准备好使用,所以你不需要知道用来实例化的具体SecurityManager实例类。

当然,如果你确实想指定你自己的实例,你可以只定义你自己的实现,如下所示:

n[users]

[users] section 允许你定义一组静态的用户帐户。这在大部分拥有少数用户帐户或用户帐户不需要在运行时被动态地创建的环境下是很有用的,比如:

n每行的格式

username = password, roleName1, roleName2, …, roleNameN

n

n自动初始化realm

仅定义非空的[users]或[roles] section 将会自动地触发org.apache.shiro.realm.text.IniRealm 实例的创建,并使它在[main] section 中可用且名为iniRealm。

n密码加密

如果你不想[users] section 中密码是纯文本的,你可以使用你喜爱的散列算法(MD5,Sha1,Sha256,等等)来进行加密,并使用生产的字符串作为密码值。默认情况下,密码字符串是16 进制编码,但可以使用Base64 编码代替16进制编码来配置。

一旦你指定了文本密码散列值,你得告诉Shiro 这些都是加密的。你可以通过配置在[main] section 中隐式地创建iniRealm 来使用合适的CredentialsMatcher 实现来对应到你所指定的哈希算法。比如在ini文件中:

[main]

sha256Matcher = org.apache.shiro.authc.credential.Sha256CredentialsMatcher

iniRealm.credentialsMatcher = $sha256Matcher

[users]

javass =355b1bbfc96725cdce8f4a2708fda310a80e6d13315aec4e5eed2a75fe8032ce,role1

n获取密码的 hex 加密字符串

String ss = new Sha256Hash("cc").toHex();

n你也可以像任何其他对象一样在CredentialsMatcher 上配置任何属性,以反映你哈希策略,反正是JavaBean风格的

n比如:指定Base64编码

[main]

sha256Matcher = org.apache.shiro.authc.credential.Sha256CredentialsMatcher

sha256Matcher.storedCredentialsHexEncoded=false

iniRealm.credentialsMatcher = $sha256Matcher

[users]

javass =NVsbv8lnJc3Oj0onCP2jEKgObRMxWuxOXu0qdf6AMs4=,role1

n当然获取密码的 Base64 加密字符串得用下面的语句:

String ss = new Sha256Hash("cc").toBase64();

n[roles]

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

n每行的格式

rolename = permissionDefinition1, permissionDefinition2, …

permissionDefinition 是一个任意的字符串,但大多数人将会使用符合org.apache.shiro.authz.permission.WildcardPermission 格式的字符串。

n注意事项

1:如果一个独立的permissionDefinition 需要被内部逗号分隔(例如,printer:5thFloor:print,info),你需要用户双引号环绕该定义,以避免错误解析。

2:如果角色不想关联权限,那你不需要在[roles] section 中间把他们列出来。只需定义在[user]section 中定义角色名就足以创建尚不存在的角色。

n[urls]

这个放到学web的时候再讲

Shiro的Permissions

n基础语法之 简单的字符串

就是用简单的字符串来表示一个权限,如:queryPrinter

n基础语法之 多层次管理

1:比如:printer:print

printer:manage

在这个例子中的冒号是一个特殊字符,它用来分隔权限字符串的下一部件。

其中第一部分是权限被操作的领域(打印机),第二部分是被执行的操作。

2:多个值

每个部件能够保护多个值。因此,除了授予用户“printer:print”和“printer:query”权限外,你可以简单地授予他们一个

printer:print, query

3:还可以用*号代替所有的值,如:printer:* , 当然你也可以写:*:view,表示某个用户在所有的领域都有view的权限

n基础语法之 实例级访问控制

1:这种情况通常会使用三个部件——第一个是域,第二个是操作,第三个是被付诸实施的实例。如:printer:query:lp7200

也可以使用通配符来定义,如:

printer:print:*

printer:*:*

printer:*:lp7200

printer:query, print:lp7200

2:部分省略:缺少的部件意味着用户可以访问所有与之匹配的值,比如:

printer:print  等价于 printer:print:*

printer  等价于 printer:*:*

但是请记住:只能从字符串的结尾处省略部件,也就是说

printer:lp7200  并不等价于 printer:*:lp7200

时间: 2024-11-08 21:43:50

第三章:Shiro的配置的相关文章

Java Persistence with MyBatis 3(中文版) 第三章 使用XML配置SQL映射器

关系型数据库和SQL是经受时间考验和验证的数据存储机制.和其他的ORM 框架如Hibernate不同,MyBatis鼓励开发者可以直接使用数据库,而不是将其对开发者隐藏,因为这样可以充分发挥数据库服务器所提供的SQL语句的巨大威力.与此同时,MyBaits消除了书写大量冗余代码的痛苦,它使使用SQL更容易. 在代码里直接嵌套SQL语句是很差的编码实践,并且维护起来困难.MyBaits使用了映射器配置文件或注解来配置SQL语句.在本章中,我们会看到具体怎样使用映射器配置文件来配置映射SQL语句.

Spring 学习指南 第三章 bean的配置 (未完结)

第三章 bean 的配置 ? 在本章中,我们将介绍以下内容: bean 定义的继承: 如何解决 bean 类的构造函数的参数: 如何配置原始类型 (如 int .float 等) .集合类型(如 java.util.List.java.util.Map)等以及自定义类型 (如 Address ) 等的 bean 属性和构造函数参数: 如何通过使用 p 命名空间和 c 命名空间分别指定 bean 属性和构造参数来使用应用程序上下文 XML 文件变得简洁: Spring 的 FactoryBean

【Ogre编程入门与进阶】第三章 Ogre框架配置及概要分析 [转载]

分类: Orge模块2014-01-07 23:26 425人阅读 评论(0) 收藏 举报 3.1 Ogre支持的系统平台 笔者认为,Ogre几乎可以支持所有的系统平台.这并不是天方夜谭,Ogre的确拥有很强的跨平台性. Ogre是一个用C++语言开发的图形渲染引擎,Ogre最开始主要应用于Windows系统平台.不过随着Ogre的不断发展,Ogre的核心团队吸纳了精通Mac OS X和Linux系统的人才,来开发适用于这两种系统平台的Ogre,目前,Ogre开发团队中有专门的人员来维护Mac

IDEA第三章----idea常用配置

前两章讲解了idea的git.maven.jdk.tomcat.编码等基本配置,可以让你的项目正常运行,这一章将讲解idea的一些常用设置,这些也正是idea可爱之处,大大提高了开发的效率. 第一节:idea常用配置 显示行数.显示方法分割线 Windows环境下debug速度更快 代码自动提示(忽略大小写) 光标行背景颜色 代码检查等级 修改文件后父文件夹颜色改变 设置导入Java包几个变为* 设置编辑的tab可以打开几个 设置注释默认单词开头而不是行头 选中的单词高亮 Maven自动导入源码

Java Persistence with MyBatis 3(中文版) 第四章 使用注解配置SQL映射器

在上一章,我们看到了我们是怎样在映射器Mapper XML配置文件中配置映射语句的.MyBatis也支持使用注解来配置映射语句.当我们使用基于注解的映射器接口时,我们不再需要在XML配置文件中配置了.如果你愿意,你也可以同时使用基于XML和基于注解的映射语句. 本章将涵盖以下话题: l 在映射器Mapper接口上使用注解 l 映射语句 @Insert,@Update,@Delete,@SeelctStatements l 结果映射 一对一映射 一对多映射 l 动态SQL @SelectProvi

Testlink1.9.17使用方法( 第三章 初始配置[配置用户、产品] )

第三章 初始配置(配置用户.产品) 一. 设置用户 QQ交流群:585499566 在TestLink系统中,每个用户都可以维护自己的私有信息.admin可以创建用户,但不能看到其它用户的密码.在用户信息中,需要设置Email地址,如果用户忘记了密码,系统可以通过mail获得. TestLink系统提供了六种角色,分别是tester.guest.tester. test designer .senior tester .leader.admin.相对应的功能权限如下: 6个用户级别: l Gue

第三章 Linux操作系统的安装

第三章 Linux操作系统的安装 因为笔者一直都是使用CentOS,所以这次安装系统也是基于CentOS的安装.把光盘插入光驱,设置bios光驱启动.进入光盘的欢迎界面. 其中有两个选项,可以直接按回车,也可以在当前界面下输入 linux text 按回车.前者是图形下安装,可以动鼠标的,后者是纯文字形式的.建议初学者用前者安装.直接回车后,出现一下界面: 这一步是要提示你是否要校验光盘,目的是看看光盘中的安装包是否完整或者是否被人改动过,一般情况下,如果是正规的光盘不需要做这一步操作,因为太费

linux程序设计——文件操作(第三章)

第三章    文件操作 3.1 linux文件结构 与UNIX一样,linux环境中的文件具有特别重要的意义,因为它们为操作系统服务和设备提供了一个简单而一致的接口.在linux中,一切都是文件. 这意味着,通常程序可以像使用文件那样使用磁盘文件.串行口.打印机等等. 目录也是文件,但它是一种特殊类型的文件.在现代UNIX(包括linux)版本中,即使是超级用户可能也不再被允许直接对目录进行写左操作了.所有用户通常都使用上层的opendir/readdir接口来读取目录,而无需了解特定系统中目录

《从0到1》笔记 第三章 所有成功的企业都是不同的

第三章 所有成功的企业都是不同的----科技企业的创新就是为了垄断,成功的科技企业都是垄断式的. 在商界,钱就是一切,或至少是非常重要.垄断者除了想着赚钱外还有余力想其它事情,而非垄断者就不行.在完全竞争中,企业着眼于短期利益,不可能对未来进行长期规划.要想企业从每日的生成竞赛中解脱出来,唯一的方法就是:获取垄断利润. 企业成功的原因各有不同:每个垄断企业都是靠解决独一无二的问题而获得垄断地位:而企业失败的原因却相同:它们都无法逃脱竞争. 国内的垄断者,如百度,解决了中文搜索的问题,垄断了搜索的

阅读《软件工程—理论方法与实践》第三章心得体会

通过对第三章的阅读,对以下概念有了了解:软件项目管理是为了使软件项目能够按照预定的成本.进度.质量顺利完成,而对成本.人员.进度.质量.风险等进行分析和管理的活动.其有利于将软件开发人员的个人开发能力转化成企业的开发能力,并使企业的软件开发能力不断提高和成熟.软件项目的特征有软件产品的不可见性.项目的高度不确定性.软件过程的多变化性,降低复杂性和控制变化成为软件项目管理面临的关键问题.软件项目管理集中于人员.产品.过程和项目.软件项目的生命周期包括项目启动(确定项目的目标和范围).项目规划(建立