文档章节

Shiro的配置

boonya
 boonya
发布于 2014/11/20 13:38
字数 1964
阅读 228
收藏 0
点赞 0
评论 0

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自动初始化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
私塾在线原创,转载请注明http://sishuok.com/forum/blogPost/list/7454.html#32584


本文转载自:http://sishuok.com/forum/blogPost/list/7454.html;jsessionid=C80F0E848FB96291C0926420CB38C104

共有 人打赏支持
boonya
粉丝 72
博文 211
码字总数 43922
作品 0
成都
高级程序员
JFinal 整合 Shiro

最近整合JFinal和Shiro遇到的问题,希望能给你们提示与帮助。 首先,JFinal和Shiro本人都是刚刚接触,JFinal上手很快,但Shiro上手比较费劲,看了很长时间的文档。 下面说一下整合JFinal配置...

小鲅鱼 ⋅ 2013/06/02 ⋅ 10

SpringMvc + Shiro[数据库存权限] 配置 ;[附git.oschina的项目地址]

一 shiro简介 apache shiro 是功能强大并且容易集成的开源权限框架,它能够完成认证、授权、加密、会话管理等功能。认证和授权为权限控制的核心,简单来说,“认证”就是证明“你是谁?” We...

王庭 ⋅ 2015/10/28 ⋅ 3

一步一步教你用shiro——4配置并自定义sessionDao

一步一步教你用shiro——1引入shiro框架 一步一步教你用shiro——2配置并自定义realm 一步一步教你用shiro——3配置并自定义sessionManager 一步一步教你用shiro——4配置并自定义sessionDa...

肥肥小浣熊 ⋅ 04/30 ⋅ 0

一步一步教你用shiro——5配置rememberMe

一步一步教你用shiro——1引入shiro框架 一步一步教你用shiro——2配置并自定义realm 一步一步教你用shiro——3配置并自定义sessionManager 一步一步教你用shiro——4配置并自定义sessionDa...

肥肥小浣熊 ⋅ 04/30 ⋅ 0

一步一步教你用shiro——6总结和心得

一步一步教你用shiro——1引入shiro框架 一步一步教你用shiro——2配置并自定义realm 一步一步教你用shiro——3配置并自定义sessionManager 一步一步教你用shiro——4配置并自定义sessionDa...

肥肥小浣熊 ⋅ 04/30 ⋅ 0

Apache Shiro 使用手册(五)Shiro 配置说明

Apache Shiro的配置主要分为四部分: 对象和属性的定义与配置 URL的过滤器配置 静态用户配置 静态角色配置 其中,由于用户、角色一般由后台进行操作的动态数据,因此Shiro配置一般仅包含前两...

heroShane ⋅ 2014/02/10 ⋅ 0

一步一步教你用shiro——3配置并自定义sessionManager

一步一步教你用shiro——1引入shiro框架 一步一步教你用shiro——2配置并自定义realm 一步一步教你用shiro——3配置并自定义sessionManager 一步一步教你用shiro——4配置并自定义sessionDa...

肥肥小浣熊 ⋅ 04/30 ⋅ 0

JFinal 整合 Shiro

(例子+源码 http://my.oschina.net/smile622/blog/203459) 最近整合JFinal和Shiro遇到的问题,希望能给你们提示与帮助。 首先,JFinal和Shiro本人都是刚刚接触,JFinal上手很快,但Shiro上手...

浮躁的码农 ⋅ 2015/12/03 ⋅ 0

使用 Smart Security 实现安全控制

很多朋友都问过我同样一个问题:“Smart 目前有身份认证与权限管理等安全控制功能吗?” 当听到这样的问题时,我真的非常不好意思,实在是没有这方面的特性。不过当我学习了 Shiro 以后,让我...

黄勇 ⋅ 2014/03/31 ⋅ 11

一步一步教你用shiro——1引入shiro框架

一步一步教你用shiro——1引入shiro框架 一步一步教你用shiro——2配置并自定义realm 一步一步教你用shiro——3配置并自定义sessionManager 一步一步教你用shiro——4配置并自定义sessionDa...

肥肥小浣熊 ⋅ 04/30 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

R计算IV

参考文章 #读取文件 rawdata = read.csv("/path/to/csv/file",header=T) colnames(rawdata)[18] <- "y" //重命名因变量y #数据分区 训练集测试集 trainIdx <- sample(nrow(rawdata), round(......

火力全開 ⋅ 20分钟前 ⋅ 0

SQL老司机,在SQL中计算 array & map & json数据

摘要: 场景 通常,我们处理数据,一列数据类型要么是字符串,要么是数字,这些都是primitive类型的数据。 场景 通常,我们处理数据,一列数据类型要么是字符串,要么是数字,这些都是primi...

阿里云云栖社区 ⋅ 20分钟前 ⋅ 0

SQL老司机,在SQL中计算 array & map & json数据

摘要: 场景 通常,我们处理数据,一列数据类型要么是字符串,要么是数字,这些都是primitive类型的数据。 场景 通常,我们处理数据,一列数据类型要么是字符串,要么是数字,这些都是primi...

猫耳m ⋅ 31分钟前 ⋅ 0

关于ireport自定义变量类型为list的时候

自己摸石头过河,我真的应该去趟市中心图书馆,借本真正靠谱的教材 网上的东西,只有0.01%是有用的,还有0.99%是垃圾,剩下的99%是垃圾的复制品。。 哎!~ 问题是这样的,报表带sql,从db中获...

炑炑milina ⋅ 31分钟前 ⋅ 0

Spring mvc ContextLoaderListener 原理解析

对于熟悉Spring MVC功能,首先应从web.xml 开始,在web.xml 文件中我们需要配置一个监听器 ContextLoaderListener,如下。 <!-- 加载spring上下文信息,最主要的功能是解析applicationContex...

轨迹_ ⋅ 32分钟前 ⋅ 0

阿里云发布企业数字化及上云外包平台服务:阿里云众包平台

摘要: 阿里云正式发布旗下众包平台业务(网址:https://zhongbao.aliyun.com/),支持包括:网站定制开发,APP、电商系统等软件开发,商标、商品LOGO、VI、产品包装设计、营销推广、大数据人...

阿里云官方博客 ⋅ 34分钟前 ⋅ 0

Redis安装异常解决办法

官网地址:http://redis.io/ 官网下载地址:http://redis.io/download 1. 下载Redis源码(tar.gz),并上传到Linux 2. 解压缩包:tar zxvf redis-2.8.17.tar.gz 3. 进入解压缩后的文件夹:c...

slagga ⋅ 38分钟前 ⋅ 0

006. 深入JVM学习—年轻代

1. 年轻代图片 年轻代(Young)属于JVM堆内存空间的一个组成部分 所有使用关键字new新实例化的对象一定会在伊甸园区进行保存,而对于存活区保存的一定是已经在伊甸园区存在一段时间并且经过了...

影狼 ⋅ 39分钟前 ⋅ 0

如何成为一个合格的程序员

偶尔的,我会被人问道:如何成为一名优秀的程序员,更或者,如何成为一名程序员。每次人们问起,我都力图给出不同的答案。因此,我的答案是各种各样的。下面就是我认为的成为一名优秀的程序员...

柳猫 ⋅ 40分钟前 ⋅ 0

cups error_log日志暴增

日志内容 File \"/usr/lib/cups/notifier/dbus\" has insecure permissions 解决(未验证适用范围) sudo service cups stopsudo rm /etc/cups/subscriptions.conf*sudo rm -r /var/cac......

一介码夫_Hum ⋅ 43分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部