Apache_Shiro开发文档
- 格式:pdf
- 大小:1.12 MB
- 文档页数:92
ApacheShiro反序列化漏洞(Shiro-550CVE-2016-4437)0x00 漏洞描述Apache Shiro是⼀款开源安全框架,提供⾝份验证、授权、密码学和会话管理。
Shiro框架直观、易⽤,同时也能提供健壮的安全性。
Apache Shiro 1.2.4及以前版本中,加密的⽤户信息序列化后存储在名为remember-me的Cookie中。
攻击者可以使⽤Shiro的默认密钥伪造⽤户Cookie,触发Java反序列化漏洞,进⽽在⽬标机器上执⾏任意命令只要rememberMe的AES加密密钥泄露,⽆论shiro是什么版本都会导致反序列化漏洞。
0x01 影响版本Apache Shiro <= 1.2.40x02 漏洞原理Apache Shiro框架提供了记住我的功能(RememberMe),关闭了浏览器下次再打开时还是能记住你是谁,下次访问时⽆需再登录即可访问。
⽤户登陆成功后会⽣成经过加密并编码的cookie。
Apache Shiro 1.2.4及以前版本中,Apache Shiro默认使⽤了CookieRememberMeManager,其处理cookie的流程是:得到rememberMe的cookie值 > Base64解码–>AES解密–>反序列化。
然⽽AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞在服务端接收cookie值时,按照如下步骤来解析处理:1、检索RememberMe cookie 的值2、Base 64解码3、使⽤AES解密(加密密钥硬编码)4、进⾏反序列化操作(未作过滤处理)但是,AES加密的密钥Key被硬编码在代码⾥,意味着每个⼈通过源代码都能拿到AES加密的密钥。
因此,攻击者构造⼀个恶意的对象,并且对其序列化,AES加密,base64编码后,作为cookie的rememberMe字段发送。
Shiro将rememberMe进⾏解密并且反序列化,最终造成反序列化漏洞。
Apache模块开发指南1000字Apache是一款非常流行的开源Web服务器,它的支持模块化架构设计使其可以扩展其功能,增加一些自定义的操作。
而Apache模块开发则是开发者可以根据业务需求自定义功能与处理方式。
Apache模块开发主要有两种形式,一种是编写模块,另外一种是编写模块的扩展。
编写模块编写模块起用比较简单,只需按照Apache的模块接口格式,将其添加到源代码中即可。
开发一个Apache模块,需要掌握以下几个知识点。
1. Apache的模块结构Apache上的模块采用模块函数表结构,在这个结构中定义了一组指向具体实现代码的函数指针。
因此,开发人员需要在模块函数表结构中,添加自己的模块函数。
这里所定义的模块函数在挂载模块和模块的时候会被调用,实现对模块的对应的控制操作。
2. 请求的处理方式Apache处理请求的方式随请求的不同而不同,常见的是处理静态请求和动态请求。
当处理静态请求时,Apache从磁盘上读取所需的静态文件;当处理动态请求时,Apache则转向Perl、PHP等脚本处理器,处理所需的请求。
我们在实际开发中需要针对不同的请求,实现对应的处理方式。
3. 访问请求的内存池Apache为每个请求都创建了一个内存池,开发者可以在该内存池中分配内存空间,以便在请求被处理的各个阶段使用。
4. 访问请求前的验证环节Apache提供了一个验证模式,允许模块在允许或拒绝请求前进行验证。
验证的方法可以是基于用户的,也可以是基于请求URL的。
实现这一验证功能需要针对验证模式,实现特定的验证函数。
编写模块的扩展Apache模块的扩展,通常是一组函数包,用于向开发者提供一些辅助处理方法。
在Apache的扩展中,扩展者通常需要实现以下几个方面的内容:1. 实现驱动函数Apache扩展的驱动函数通常负责初始化和清除扩展时所需要的一些内存。
为了保证扩展的正常运作,开发者需要注意以确保驱动函数被正确的使用。
Shiro权限管理框架(⼀):Shiro的基本使⽤shiro概念:Apache Shiro是⼀个强⼤且易⽤的Java安全框架,执⾏⾝份验证、授权、密码和会话管理。
使⽤Shiro的易于理解的API,您可以快速、轻松地获得任何应⽤程序,从最⼩的移动应⽤程序到最⼤的⽹络和企业应⽤程序。
上⾯这段话来⾃百度百科,没啥⽤。
想要快速理解并使⽤Shiro要先从最重要的三⼤概念⼊⼿。
1. Subject:⼤⽩话来讲就是⽤户(当然并不⼀定是⽤户,也可以指和当前应⽤交互的任何对象),我们在进⾏授权鉴权的所有操作都是围绕Subject(⽤户)展开的,在当前应⽤的任何地⽅都可以通过SecurityUtils的静态⽅法getSubject()轻松的拿到当前认证(登录)的⽤户。
2. SecurityManager:安全管理器,Shiro中最核⼼的组件,它管理着当前应⽤中所有的安全操作,包括Subject(⽤户),我们围绕Subject展开的所有操作都需要与SecurityManager进⾏交互。
可以理解为SpringMVC中的前端控制器。
3. Realms:字⾯意思为领域,Shiro在进⾏权限操作时,需要从Realms中获取安全数据,也就是⽤户以及⽤户的⾓⾊和权限。
配置Shiro,我们⾄少需要配置⼀个Realms,⽤于⽤户的认证和授权。
通常我们的⾓⾊及权限信息都是存放在数据库中,所以Realms也可以算是⼀个权限相关的Dao层,SecurityManager在进⾏鉴权时会从Realms中获取权限信息。
这三个基本的概念简答理解后就可以开始配置和使⽤Shiro了,其实Shiro最基本的使⽤⾮常简单,加⼊依赖后只需要配置两个Bean,再继承⼀个抽象类实现两个⽅法即可。
基本使⽤:引⼊⼀个依赖新建⼀个基于Springboot的Web项⽬,引⼊Shiro依赖。
<!-- https:///artifact/org.apache.shiro/shiro-web --><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>1.4.0</version></dependency>配置两个Bean新建⼀个Shiro配置类,配置Shiro最为核⼼的安全管理器SecurityManager。
ApacheShiro的作用和使用方式Apache Shiro的作用和使用方式Apache Shiro是一个功能强大且易于使用的Java安全框架,旨在为应用程序提供身份验证、授权、加密和会话管理等安全功能。
本文将介绍Apache Shiro的作用以及使用方式,并帮助读者更好地理解和应用该框架。
作用:1. 身份验证(Authentication):Apache Shiro提供了多种身份验证机制,包括基于表单的身份验证、基于LDAP的身份验证和基于数据库的身份验证等。
通过使用Shiro的身份验证功能,应用程序可以验证用户的身份,并确保只有经过身份验证的用户才能访问受保护的资源。
2. 授权(Authorization):Apache Shiro支持基于角色和权限的访问控制。
通过定义角色和权限,应用程序可以根据用户的身份和权限限制其对资源的访问。
Shiro还提供了基于注解的授权功能,可以方便地在代码中标注需要授权的方法或类。
3. 加密(Cryptography):Apache Shiro提供了密码加密和解密的功能,可以帮助应用程序保护用户的密码和敏感信息。
Shiro支持常用的加密算法,如MD5、SHA和AES等,开发者可以根据需求选择合适的加密方式。
4. 会话管理(Session Management):Apache Shiro可以有效地管理用户会话,包括会话的创建、维护和销毁。
Shiro支持将会话存储在内存中、数据库中或持久化到文件系统中,并且提供了集群会话管理的解决方案,可用于多台服务器的分布式应用程序。
使用方式:1. 引入依赖:在项目的构建文件中,添加Apache Shiro的依赖项。
如果使用Maven进行项目管理,可以在pom.xml文件中添加以下依赖:```xml<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.7.1</version></dependency>```2. 配置文件:创建一个名为shiro.ini的配置文件,其中包含了应用程序需要的安全配置信息,如身份验证器、授权器和加密器等。
apache shiro rememberme反序列化规则Apache Shiro是一个强大的、灵活的安全框架,它允许认证、授权、加密和会话管理。
在Shiro中,"RememberMe"功能允许用户在关闭浏览器后仍然保持登录状态。
然而,如果未正确配置"RememberMe",则可能会出现安全问题,如"反序列化攻击"。
这是因为"RememberMe"功能通常涉及到将用户会话数据序列化并存储在客户端(如cookie),然后在用户下次访问时进行反序列化。
如果攻击者能够修改存储在客户端的数据,他们可能会进行恶意操作,例如将一个已登录的用户会话转移到另一个用户。
为了防止这种攻击,你需要确保以下几点:1. 使用安全的序列化机制:默认情况下,Shiro使用Java的序列化机制。
然而,Java序列化不是安全的,因为它不验证发送方的身份。
为了安全起见,你应该使用一个安全的序列化机制,如JSON或加密的二进制格式。
2. 使用安全的加密:为了确保存储的数据在传输过程中不被篡改,你应该使用安全的加密算法对数据进行加密。
3. 验证数据的完整性:在反序列化数据之前,你应该验证数据的完整性。
如果数据被篡改,你应该拒绝反序列化并使用户登出。
4. 使用HTTP Only Cookies:为了防止通过JavaScript访问存储在cookie中的数据,你应该设置cookie的HTTP Only属性。
这样,只有服务器可以访问cookie 数据,从而防止了攻击者通过客户端脚本修改cookie。
5. 确保密钥的安全性:对于任何加密或哈希操作,你都应该使用强密钥。
如果攻击者获得了密钥,他们可能会解密或伪造数据。
6. 限制RememberMe的会话超时时间:不要让RememberMe会话无限期地持续下去。
设置一个合理的超时时间可以减少长时间未活动的会话被劫持的风险。
ApacheShiro反序列化漏洞(Shiro-721CVE-2016-4437)0x00 漏洞介绍Apache Shiro 存在⾼危代码执⾏漏洞。
该漏洞是由于Apache Shiro cookie中通过 AES-128-CBC 模式加密的rememberMe字段存在问题,⽤户可通过Padding Oracle 加密⽣成的攻击代码来构造恶意的rememberMe字段,并重新请求⽹站,进⾏反序列化攻击,最终导致任意代码执⾏。
0x01 影响版本Apache Shiro 1.2.5, 1.2.6, 1.3.0, 1.3.1, 1.3.2, 1.4.0-RC2, 1.4.0, 1.4.1版本。
0x02 漏洞指纹1.set-Cookie: rememberMe=deleteMe2.URL中有shiro字样3.有⼀些时候服务器不会主动返回 rememberMe=deleteMe, 直接发包即可0x03 利⽤技巧1.该漏洞需要登录后获取到合法的Cookie: rememberMe=XXX后才可以进⾏利⽤, 看起来不是很好利⽤但实际上有⼀些⽹站是开放注册的, ⽽且这个洞不需要知道服务端密钥所以后续的利⽤还是可以同Shiro-550⼀样利⽤, ⽽且这⾥是AES加密的, ⾃带过WAF属性;2.如果攻击没有⽣效, 可以试⼀下删除Cookie中的JSESSIONID 字段, 很多时候这个字段存在的话, 服务端不会去处理 rememberMe。
0x04 漏洞原理由于Apache Shiro cookie中通过 AES-128-CBC 模式加密的rememberMe字段存在问题,⽤户可通过Padding Oracle 加密⽣成的攻击代码来构造恶意的rememberMe字段,并重新请求⽹站,进⾏反序列化攻击,最终导致任意代码执⾏。
0x04 环境搭建1.利⽤docker搭建环境⼀:root@backlion-virtual-machine:/opt# docker pull vulfocus/shiro-cve_2016_4437root@backlion-virtual-machine:/opt#docker psroot@backlion-virtual-machine:/opt#docker run -d -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock -e VUL_IP=192.168.1.14 be60cf0b77042.利⽤dokcer 搭建环境⼆:复现环境: Apache Shiro 1.4.1 + tomcat:8-jre8git下载shiro-720到本地环境git clone对shiro-720进⾏编译cd Shiro-721/Dockerdocker build -t shiro-721 .启动dokcer并将端⼝8080映射到主机端⼝8080上docker run -p 8080:8080 -d shiro-721查看是否搭建成功docker ps3.通过⾃⾏编译1.4.1war 包放⼊tomcat容器中运⾏安装mavenwgettar zxvf apache-maven-3.6.3-bin.tar.gz -C /usr/localvi /etc/profileexport MAVEN_HOME=/usr/local/apache-maven-3.6.3export PATH=$MAVEN_HOME/bin:$PATHsource /etc/profilemvn -vvim /usr/local/apache-maven-3.6.3/conf/settings.xml找到mirrors节点添加阿⾥镜像库地址:<mirrors><mirror><id>alimaven</id><name>aliyun maven</name><url>/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf></mirror></mirrors>可从 Apache Shiro Gtihub 官⽅仓库⾃⾏下载漏洞影响版本(https:///apache/shiro),使⽤ Apache Maven(软件项⽬管理及⾃动构建⼯具) 编译构建⽣成 war Java 应⽤程序包。
shiro securityutils解析Shiro(Apache Shiro)是一个用于身份验证、授权和加密的开源Java安全框架。
`SecurityUtils`是Shiro框架中的一个工具类,提供了一些便捷的方法来访问和操作Shiro 的安全功能。
以下是对`SecurityUtils`的一些主要功能和用法的解析:1.获取Subject对象:```javaSubject currentUser=SecurityUtils.getSubject();```可以使用`getSubject()`方法获取当前应用程序的Subject对象,Subject代表了当前用户。
通过Subject对象,可以进行身份验证、授权和其他安全操作。
2.身份验证:```javaif(!currentUser.isAuthenticated()){UsernamePasswordToken token=new UsernamePasswordToken("username", "password");token.setRememberMe(true);try{currentUser.login(token);}catch(AuthenticationException e){//身份验证失败}}```使用`login`方法进行身份验证。
在这个例子中,使用了`UsernamePasswordToken`来封装用户名和密码,然后通过`login`方法进行验证。
3.授权检查:```javaif(currentUser.hasRole("admin")){//执行某些操作,具有"admin"角色}```使用`hasRole`方法检查用户是否具有指定的角色。
4.权限检查:```javaif(currentUser.isPermitted("user:read")){//执行某些操作,具有"user:read"权限}```使用`isPermitted`方法检查用户是否具有指定的权限。
SpringSecurity与ApacheShiro的比较Spring Security与Apache Shiro的比较随着软件系统的快速发展,用户安全性在应用程序设计中变得越来越重要。
为了提供可靠的用户认证和授权机制,开发者可以使用不同的安全框架。
本文将比较并探讨Spring Security和Apache Shiro两个流行的安全框架,以帮助读者了解它们之间的差异和优劣势。
一、简介Spring Security是一个功能强大的安全框架,提供了全面的身份验证、授权和访问控制解决方案。
它是基于Spring Framework的,通过使用过滤器链和拦截器来实现安全功能。
Apache Shiro是一个易于使用的Java安全框架,提供身份验证、授权、加密和会话管理等功能。
它可以与任何应用程序集成,并且不依赖于任何其他框架。
二、功能比较1.身份验证Spring Security提供了多种身份验证机制,包括基于表单、HTTP基本认证、LDAP、OpenID等。
它还支持自定义身份验证方式,开发者可以根据应用程序的需求进行扩展。
Apache Shiro同样支持多种身份验证方式,包括基于表单、HTTP基本认证、LDAP等。
与Spring Security相比,它的身份验证配置更易于理解和使用。
2.授权Spring Security可以使用基于角色或基于权限的授权机制。
它提供了注解、表达式和配置文件等多种方式来定义安全规则,并使用AccessDecisionManager来进行决策。
Apache Shiro同样支持基于角色或基于权限的授权。
它使用一个简单的权限字符串来定义访问规则,并提供了很多方便的注解和API来实现授权功能。
3.会话管理Spring Security提供了多种会话管理方式,包括基于Cookie的会话和基于URL重写的会话。
它还支持集群和单点登录,并提供了容器管理和自定义会话存储等功能。
Apache Shiro同样提供了灵活的会话管理机制,包括基于Cookie的会话和基于URL重写的会话。
Shiro1.1.0开发配置文档建立一个java应用程序项目,项目及文件结构如图:注意以下几点:1、导入与Shiro相关的库,如图所示几个jar包,如运行时出现log4j相关的错误,则可能是log4j相关的包不正确;2、shiro.ini文件的路径问题,应放在项目根路径下,内容为:view plain1.[users]2.zwx=zavens3、log4j.properties文件为可选文件,建议自己设置log4j属性,内容为:view plain1.log4j.rootLogger=TRACE, stdout2.3.log4j.appender.stdout=org.apache.log4j.DailyRollingFileAppender4.log4j.appender.stdout.File=C:/log4j/log.txt5.log4j.appender.stdout.Encoding=GBK6.log4j.appender.stdout.Threshold=DEBUG7.log4j.appender.stdout.DatePattern='.'yyyy-MM-ddyout=org.apache.log4j.PatternLayoutyout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L : %m%n10..sf.ehcache=WARN.apache=WARN.quartz=WARN.apache.shiro=TRACE.apache.shiro.util.ThreadContext=INFO4、shiroAp.java内容:view plain1.package shiroap;2.3.import java.io.File;4.import java.io.IOException;5.import org.apache.shiro.SecurityUtils;6.import ernamePasswordToken;7.import org.apache.shiro.config.IniSecurityManagerFactory;8.import org.apache.shiro.mgt.SecurityManager;9.import org.apache.shiro.subject.Subject;10.import org.apache.shiro.util.Factory;11.12.public class ShiroAp {13.14.public static void main(String[] args) throws IOException {15. Factory<SecurityManager> factory = new IniSecurityManagerFactory("shiro.ini");16. SecurityManager sm=factory.getInstance();17. SecurityUtils.setSecurityManager(sm);18. Subject sub=SecurityUtils.getSubject();19.if(sub.isAuthenticated()){20. System.out.println("已登录,SESSION:" + sub.getSession());21. }22. System.out.println("未登录,SESSION:" + sub.getSession());23. UsernamePasswordToken at=new UsernamePasswordToken ("zwx","zavens");24.try{25. sub.login(at);26. }catch(Exception e){27. System.out.println("验证没通过!");28. }29.if(sub.isAuthenticated()){30. System.out.println("已登录,SESSION:" + sub.getSession());31. }32. }33.}Shiro是一个简单、开源且强大的安全管理框架,是实现单点登录的理想选择,常被应用于java web应用中。
shiro的使用的步骤Shiro是一个开源的Java安全框架,用于简化应用程序的身份验证、授权、加密等安全操作。
它提供了一套易于使用的API和一系列可配置的组件,以帮助开发者快速实现安全功能。
下面是使用Shiro的一般步骤:1. 引入Shiro依赖:首先,我们需要在项目中引入Shiro的依赖库。
可以通过Maven或手动下载并添加到项目中。
例如,在Maven 项目中,可以在POM文件中添加以下依赖:xml<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.8.0</version></dependency>2. 配置Shiro:在使用Shiro之前,我们需要配置Shiro的环境。
这包括配置安全策略、数据源、缓存等。
Shiro的配置可以通过properties文件、XML文件或编程方式进行。
- 配置文件方式:创建一个shiro.ini或shiro.xml文件,并配置相应的组件。
例如,定义一个基于用户名/密码的身份验证器:[main]myRealm = com.example.MyRealmsecurityManager.realms = myRealm[users]username=password- 编程方式:可以通过编写Java代码来配置Shiro的组件。
例如,以编程方式配置安全管理器:javaDefaultSecurityManager securityManager = new DefaultSecurityManager();securityManager.setRealm(new MyRealm());SecurityUtils.setSecurityManager(securityManager);3. 创建Realm:Realm是Shiro与应用程序数据交互的桥梁,用于身份验证、授权等操作。
Apache Shiro Reference DocumentationIntroduction to Apache ShiroWhat is Apache Shiro?Apache Shiro是一个强大而灵活的开源安全框架,它干净利落地处理身份认证,授权,企业会话管理和加密。
Apache Shiro的首要目标是易于使用和理解。
安全有时候是很复杂的,甚至是痛苦的,但它没有必要这样。
框架应该尽可能掩盖复杂的地方,露出一个干净而直观的API,来简化开发人员在使他们的应用程序安全上的努力。
以下是你可以用Apache Shiro所做的事情:∙验证用户来核实他们的身份∙对用户执行访问控制,如:∙判断用户是否被分配了一个确定的安全角色∙判断用户是否被允许做某事∙在任何环境下使用Session API,即使没有Web或EJB容器。
∙在身份验证,访问控制期间或在会话的生命周期,对事件作出反应。
∙聚集一个或多个用户安全数据的数据源,并作为一个单一的复合用户“视图”。
∙启用单点登录(SSO)功能。
∙为没有关联到登录的用户启用"Remember Me"服务…以及更多——全部集成到紧密结合的易于使用的API中。
Shiro视图在所有应用程序环境下实现这些目标——从最简单的命令行应用程序到最大的企业应用,不强制依赖其他第三方框架,容器,或应用服务器。
当然,该项目的目标是尽可能地融入到这些环境,但它能够在任何环境下立即可用。
Apache Shiro FeaturesApache Shiro是一个拥有许多功能的综合性的程序安全框架。
下面的图表展示了Shiro的重点,并且这个参考手册也会与之类似的被组织起来:Shiro把Shiro开发团队称为“应用程序的四大基石”——身份验证,授权,会话管理和加密作为其目标。
∙Authentication:有时也简称为“登录”,这是一个证明用户是他们所说的他们是谁的行为。
∙Authorization:访问控制的过程,也就是绝对“谁”去访问“什么”。
∙Session Management:管理用户特定的会话,即使在非Web或EJB应用程序。
∙Cryptography:通过使用加密算法保持数据安全同时易于使用。
也提供了额外的功能来支持和加强在不同环境下所关注的方面,尤其是以下这些:∙Web Support:Shiro的web支持的API能够轻松地帮助保护Web应用程序。
∙Caching:缓存是Apache Shiro中的第一层公民,来确保安全操作快速而又高效。
∙Concurrency:Apache Shiro利用它的并发特性来支持多线程应用程序。
∙Testing:测试支持的存在来帮助你编写单元测试和集成测试,并确保你的能够如预期的一样安全。
∙"Run As":一个允许用户假设为另一个用户身份(如果允许)的功能,有时候在管理脚本很有用。
∙"Remember Me":在会话中记住用户的身份,所以他们只需要在强制时候登录。
Apache Shiro TutorialYour First Apache Shiro Application如果你从未使用过Apache Shiro,这个简短的教程将会向您展示如何建立一个由Apache Shiro担保的初始的及非常简单的应用程序。
一路上我们将讨论Shiro的核心概念来帮助你熟悉Shiro的设计和API。
当你遵循本教程时,如果你确实不想编辑文件,你可以得到一个几乎相同的实例应用程序并按照你的意愿引用它。
选择一个位置:∙在Apache Shiro的版本控制库:https:///repos/asf/shiro/trunk/samples/quickstart∙在Apache Shiro的源代码的samples/quickstart目录。
该源代码在Download页面提供下载。
Setup在这个简单的示例中,我们将创建一个非常简单的命令行应用程序,它将会运行并迅速退出,这样你能够获得对Shiro 的API的感受。
该教程需要Java 1.5及更高本。
我们也使用Apache Maven作为我们的构建工具,但当然这不是使用Apache Shiro所必需的。
你可以获取Shiro的jar包并按你喜欢的方式合并到你的应用程序,例如可能是一Apache Ant和Ivy。
对于本教程,请确保你正在使用Maven 2.2.1或更高版本。
你应该能够键入mvn -version命令行提示符,并看到与下面类似的东西:现在,在你的文件系统上创建一个新的目录,例如,shiro-tutorial并在该目录下保存下面的Maven pom.xml文件:The Tutorial class我们将运行一个简单的命令行应用程序,因此,我们需要创建一个拥有public static void main(String[] args)方法的Java 类。
在包含你pom.xml文件的同样目录下,创建src/main/java子目录。
在src/main/java目录下创建具有下面内容的现在不必担心import语句——我们不久将会涉及到它们。
但现在,我们得有一个命令行应用程序“外形”。
该程序所能够做到全部事情是打印出文本"My First Apache Shiro Application"并退出。
Test Run要试用我们的教程应用程序,请在你的教程项目的根目录下执行以下的命令提示符,并键入以下内容:mvn compile exec:java然后你将看到我们的little教程“程序”运行并退出。
你应该会看到与下面相似的一些东西(注意粗体文本,它显示了我们的输出):Run the Applicationlhazlewood:~/projects/shiro-tutorial$ mvn compile exec:java... a bunch of Maven output ...1 [Tutorial.main()] INFO Tutorial - My First Apache Shiro Applicationlhazlewood:~/projects/shiro-tutorial\$我们已经验证了该程序运行成功——现在让我们启用Apache Shiro。
当我们继续本教程的时候,你可以在每次我们添加一些代码后运行mvn compile exec:java来观察我们变化后的结果。
Enable Shiro在应用程序中启用Shiro最先要明白的事情是几乎在Shiro中的每个东西都与一个名为SecurityManager的主要的/核心的组件有关。
对于那些熟悉Java安全的人来说,这是Shiro的SecurityManager概念——它不等同于ng.SecurityManager。
虽然我们将在Architecture章节详细的涉及到Shiro的设计,但现在了解Shiro的SecurityManager是应用程序的Shiro 环境的核心及每个应用程序中必须存在一个SecurityManager是很有益处的。
因此,在我们的教程应用程序中第一件要做的事情就是配置SecurityManager实例。
Configuration虽然我们能够直接实例化一个SecurityManager类,但Shiro的SecurityManager实现有足够的配置选项及内置组件使得在Java源代码做这件事情变得较为痛苦——如果使用一个灵活的基于文本的配置格式来配置SecurityManager,那么这将是一件很容易的事情。
为此,Shiro通过基于文本的INI配置文件提供了一个默认的"共性(common denominator)"解决方案。
近来人们已经相当厌倦了使用笨重的XML文件,且INI文件易于阅读,使用简单,依赖性低。
你稍后将会看到有了对象导航图的简单理解,INI文件能够有效地被用来配置简单的对象图,如SecurityManager。
shiro.ini因此,我们将为这个简单的应用程序使用INI文件来配置Shiro SecurityManager。
首先,在pom.xml所在的同一目录下创建src/main/resources目录。
然后在新目录下创建包含以下内容的shiro.ini文件:如你所见,这个配置基本上建立了一小组静态用户帐户,对于我们的第一个应用程序已经足够了。
在后面的章节中,你将看到我们如何使用更复杂的用户数据源,如关系数据库,LDAP的AcitveDirectory,以及更多。
Referencing the Configuration现在我们已经定义好了一个INI文件,我们可以在我们的教程应用程序类中创建SecurityManager实例了。
改变main 方法来反映以下的更新内容:好了,在仅仅添加了3行代码后,Shiro就在我们的简单应用程序中启用了!很容易是吧?轻松地运行mvn compile exec:java,并看到这一切仍然运行成功(由于Shiro的默认调试日志或更低版本,你将不会看到任何的Shiro日志消息——如果在启动和运行没有报错,那么你知道一切仍然正常)。
这里是上面增加的代码所做的:1.我们使用Shiro的IniSecurityManager实现来提取我们的shiro.ini文件,它位于classpath的根目录。
该实现反映了Shiro对工厂设计模式的支持。
classpath: 前缀是一个资源定位符,用来告诉shiro去哪加载ini文件(其他前缀,如url:和file:也同样被支持)。
2.factory.getInstance()方法被调用,它来解析INI文件并返回反映该配置的SecurityManager实例。
3.在这个简单的例子中,我们把SecurityManager设置为一个静态的(memory)单例,能够跨JVM访问。
但请注意,这是不可取的,如果你在单个的JVM只中会有不只一个启用Shiro的应用程序。
对于这个简单的例子而言,这是没有问题的,但更为复杂的应用程序环境通常将SecurityManager置于应用程序特定的存储中(如在Web应用中的ServletContext或Spring,Guice后JBoss DI容器实例)。
Using Shiro现在我们的SecurityManager已经设置好并可以使用了,现在我们能够开始做一些我们真正关心的事情——执行安全操作。
当保护我们的应用程序时,我们对自己可能提出的最为相关的问题是“当前用户是谁”或“当前用户是否被允许做XXX”。
当我们编写代码或设计用户接口时,问这些问题是很常见的:应用程序通常是基于用户的背景情况建立的,且你想基于每个用户标准体现(保障)功能。