ImageVerifierCode 换一换
格式:DOCX , 页数:23 ,大小:802.39KB ,
资源ID:3427197      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3427197.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(ApacheShiro开发手册推荐文档.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

ApacheShiro开发手册推荐文档.docx

1、ApacheShiro开发手册推荐文档Apache Shiro使用手册(一) Shiro架构介绍 2Apache Shiro 使用手册(二) Shiro 认证 4Apache Shiro 使用手册(三) Shiro 授权 7Apache Shiro 使用手册(四) Realm 实现 14Apache Shiro 使用手册(五) Shiro酉己置说明 15Apache Shiro使用手册(一)Shiro架构介绍1什么是ShiroApache Shiro是一个强大易用的 Java安全框架,提供了认证、授权、加密和会话管理等 功能:认证-用户身份识别,常被称为用户“登录”;授权-访问控制;密码加密-

2、保护或隐藏数据防止被偷窥;会话管理-每用户相关的时间敏感的状态。对于任何一个应用程序, Shiro都可以提供全面的安全管理服务。并且相对于其他安全框架,Shiro要简单的多。2、Shiro的架构介绍首先,来了解一下Shiro的三个核心组件:Subject, SecurityManager和Realms.如下图:Subject:即“当前操作用户”。但是,在 Shiro中,Subject这一概念并不仅仅指人,也 可以是第三方进程、后台帐户(Daemon Accou nt )或其他类似事物。它仅仅意味着“当前跟 软件交互的东西”。但考虑到大多数目的和用途, 你可以把它认为是 Shiro的“用户”概念

3、。Subject代表了当前用户的安全操作, SecurityManager则管理所有用户的安全操作。SecurityManager :它是 Shiro 框架的核心,典型的 Facade模式,Shiro 通过 SecurityManager 来管理内部组件实例,并通过它来提供安全管理的各种服务。Realm: Realm充当了 Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说, 当对用户执行认证(登录)和授权(访问控制)验证时, Shiro会从应用配置的 Realm中查找用户及其权限信息。从这个意义上讲,Realm实质上是一个安全相关的 DAO :它封装了数据源的连接细节,并在需要时将

4、相关数据提供给 Shiro。当配置Shiro时,你必须至少指定一个 Realm,用于认证和(或)授权。配置多个 Realm是可以的,但是至少需要一个。Shiro内置了可以连接大量安全数据源(又名目录)的 Realm,如LDAP、关系数据库(JDBC )、类似INI的文本配置资源以及属性文件等。如果缺省的 Realm不能满足需求,你还可以插入代表自定义数据源的自己的 Realm实现。Shiro完整架构图:VM / Network Bounda除前文所讲 Subject、SecurityManager、Realm三个核心组件外,Shiro主要组件还包括:Authenticator :认证就是核实用

5、户身份的过程。这个过程的常见例子是大家都熟悉的“用 户/密码”组合。多数用户在登录软件系统时,通常提供自己的用户名(当事人)和支持他 们的密码(证书)。如果存储在系统中的密码(或密码表示)与用户提供的匹配,他们就被 认为通过认证。Authorizer :授权实质上就是访问控制 -控制用户能够访问应用中的哪些内容,比如资源、Web页面等等。SessionManager :在安全框架领域, Apache Shiro提供了一些独特的东西:可在任何应 用或架构层一致地使用 Session API。即,Shiro为任何应用提供了一个会话编程范式 -从小型后台独立应用到大型集群 Web应用。这意味着,那些

6、希望使用会话的应用开发者,不必被迫使用Servlet或EJB容器了。或者,如果正在使用这些容器,开发者现在也可以选择使 用在任何层统一一致的会话 API,取代Servlet或EJB机制。CacheManager :对Shiro的其他组件提供缓存支持。 |Apache Shiro 使用手册(二) Shiro 认证认证就是验证用户身份的过程。在认证过程中,用户需要提交实体信息 (Pri ncipals)和凭据信息(Credentials)以检验用户是否合法。最常见的“实体 /凭证”组合便是“用户名 /密码” 组合。1、Shiro认证过程a)收集实体/凭据信息Java代码 h滋1./Example

7、using most common scenario of username/password pair:2.UsernamePasswordToken token = new UsernamePasswordToken(username, password);3./ ” Remember Me, built-in:4.token.setRememberMe( true );UsernamePasswordToken支持最常见的用户名 /密码的认证机制。同时,由于它实现了RememberMeAuthenticationToken接口,我们可以通过令牌设置“记住我”的功能。但是,“已记住”和“已

8、认证”是有区别的:已记住的用户仅仅是非匿名用户,你可以通过 subject.getPri ncipals()获取用户信息。但是它并非是完全认证通过的用户, 当你访问需要认证用户的功能时, 你仍然需要重新提交认证信息。这一区别可以参考亚马逊网站, 网站会默认记住登录的用户, 再次访问网站时, 对于非敏感的页面功能,页面上会显示记住的用户信息, 但是当你访问网站账户信息时仍然需要再次进行登录认证。b)提交实体/凭据信息Java 代码 _1.Subject currentUser = SecurityUtils.getSubject();2.currentUser.login(token);收集了实

9、体/凭据信息之后,我们可以通过 SecurityUtils工具类,获取当前的用户,然后通过调用login方法提交认证。c) 认证处理Java 代码 曲2.3.4.5.6.7.8.9.1. try currentUser.login(token); catch ( UnknownAccountException uae ) . catch ( IncorrectCredentialsException ice ) . catch ( LockedAccountException lae ) . catch ( ExcessiveAttemptsException eae ) . . catch

10、your own . catch ( AuthenticationException ae ) /unexpected error?如果login方法执行完毕且没有抛出任何异常信息,那么便认为用户认证通过。之后在登出操作可以通过调用Java代码尉1. currentUsero gout();dates their session too.当执行完登出操作后,3、认证内部处理机制应用程序任意地方调用 SecurityUtils.getSubject()都可以获取到当前认证通过的用户实例,使用subject.isAuthenticated()判断用户是否已验证都将返回 true.相反,如果logi

11、n方法执行过程中抛出异常, 那么将认为认证失败。Shiro有着丰富的层次鲜明的异常类来描述认证失败的原因,如代码示例。2、登出操作subject.logout()来删除你的登录信息,如:/removes all identifying information and invaliSession信息将被清空,subject将被视作为匿名用户。以上,是Shiro认证在应用程序中的处理过程,下面将详细解说 Shiro认证的内部处理机制。如上图,我们通过 Shiro架构图的认证部分,来说明 Shiro认证内部的处理顺序:A) 、应用程序构建了一个终端用户认证信息的 AuthenticationToke

12、n实例后,调用Subject.login 方法。B) 、Sbuject的实例通常是 DelegatingSubject类(或子类)的实例对象,在认证开始时,会委托应用程序设置的 securityManager实例调用securityManager.login(token)方法。C) 、SecurityManager接受到token(令牌)信息后会委托内置的 Authenticator的实例(通常都是 ModularRealmAuthenticator 类的实例)调用 authenticator.authenticate(token).ModularRealmAuthenticator在认证过程

13、中会对设置的一个或多个 Realm实例进行适配,它实际上为Shiro提供了一个可拔插的认证机制。D) 、如果在应用程序中配置了多个 Realm, ModularRealmAuthenticator会根据配置的AuthenticationStrategy(认证策略)来进行多 Realm的认证过程。在 Realm被调用后, AuthenticationStrategy将对每一个 Realm的结果作出响应。(注:如果应用程序中仅配置了 一个Realm, Realm将被直接调用而无需再配置认证策略。)E)、判断每一个 Realm是否支持提交的token,如果支持,Realm将调用 getAuthe n

14、ticatio nln fo(toke n); getAuthe nticatio nlnfo 方法就是实际认证处理,我们通过覆盖Realm的doGetAuthenticationlnfo方法来编写我们自定义的认证处理。4、使用多个Realm的处理机制:a) Authenticator默认实现是 ModularRealmAuthenticator,它既支持单一 Realm也支持多个 Realm。如果仅 配置了一个 Realm, ModularRealmAuthenticator 会直接调用该 Realm处理认证信息,如果配 置了多个Realm,它会根据认证策略来适配 Realm,找到合适的Re

15、alm执行认证信息。自定义 Authenticator的配置:Java 代码1.main2.3.authenticator = com.foo.bar.CustomAuthenticator4.securityManager.authenticator = $authenticatorb) Authenticationstrategy (认证策略)当应用程序配置了多个 Realm时,ModularRealmAuthenticator将根据认证策略来判断认证成功或是失败。例如,如果只有一个 Realm验证成功,而其他 Realm验证失败,那么这次认证是否成 功呢?如果大多数的 Realm验证成功

16、了,认证是否就认为成功呢?或者,一个 Realm验证成功后,是否还需要判断其他 Realm的结果?认证策略就是根据应用程序的需要对这些问题作出决断。认证策略是一个无状态的组件,在认证过程中会经过 4次的调用:在所有Realm被调用之前在调用 Realm 的 getAuthenticationlnfo 方法之前 在调用 Realm 的 getAuthenticationlnfo 方法之后 在所有Realm被调用之后认证策略的另外一项工作就是聚合所有Realm的结果信息封装至一个 Authenticationlnfo实例中,并将此信息返回,以此作为 Subject的身份信息。Shiro有3中认证策

17、略的具体实现:AtLeastOneSuccessfulStrategy只要有一个(或更多)的Realm验证成功,那么认证将被视为成功FirstSuccessfulStrategy第一个Realm验证成功,整体认证将被视为成功,且后续Realm将被忽略AllSuccessfulStrategy所有Realm成功,认证才视为成功ModularRealmAuthe nticator 内置的认证策略默认实现是 AtLeastO neSuccessfulStrategy方式,因为这种方式也是被广泛使用的一种认证策略。 当然,你也可以通过配置文件定义你需要的策略,如:Java代码卜色1.main2.3.a

18、uthcStrategy = org.apache.shiro.authc.pam.FirstSuccessfulStrategy4.securityManager.authenticator.authenticationStrategy = $authcStrategy5. .c) Realm的顺序由刚才提到的认证策略,可以看到 Realm在ModularRealmAuthenticator 里面的顺序对认证是有影响的。 ModularRealmAuthenticator 会读取配置在 SecurityManager里的Realm。当执行认证是,它会遍历 Realm集合,对所有支持提交的 t

19、oken的Realm调用getAuthe nticati onlnfo 。因此,如果 Realm的顺序对你使用的认证策略结果有影响,那么你应该在配置文件中明确定义 Realm的顺序,如:Java代码尉1.blahRealm = pany.blah.Realm2. .3.fooRealm = pany.foo.Realm4.5.barRealm = pany.another.Realm6.7. securityManager.realms = $fooRealm, $barRealm, $blahRealmApache Shiro使用手册(三) Shiro授权授权即访问控制,它将判断用户在应用程

20、序中对资源是否拥有相应的访问权限。 女口,判断一个用户有查看页面的权限,编辑数据的权限,拥有某一按钮的权限,以及是否拥有打印 的权限等等。1、授权的三要素授权有着三个核心元素:权限、角色和用户。i.权限权限是Apache Shiro安全机制最核心的元素。 它在应用程序中明确声明了被允 许的行为和表现。一个格式良好好的权限声明可以清晰表达出用户对该资源拥有的 权限。大多数的资源会支持典型的 CRUD操作(create,read,update,delete),但是任何 操作建立在特定的资源上才是有意义的。 因此,权限声明的根本思想就是建立在资源以及操作上。而我们通过权限声明仅仅能了解这个权限可以在

21、应用程序中做些什么, 而不能确定谁拥有此权限。于是,我们就需要在应用程序中对用户和权限建立关联。通常的做法就是将权限分配给某个角色,然后将这个角色关联一个或多个用 户。ii.权限声明及粒度Shiro权限声明通常是使用以冒号分隔的表达式。就像前文所讲,一个权限表 达式可以清晰的指定资源类型,允许的操作,可访问的数据。同时, Shiro权限表达式支持简单的通配符,可以更加灵活的进行权限设置。下面以实例来说明权限表达式。可查询用户数据User:view可查询或编辑用户数据User:view,edit可对用户数据进行所有操作User:* 或 user可编辑id为123的用户数据User:edit:12

22、3iii.角色Shiro支持两种角色模式:1、 传统角色:一个角色代表着一系列的操作,当需要对某一操作进行授权验 证时,只需判断是否是该角色即可。这种角色权限相对简单、模糊,不利于扩展。2、 权限角色:一个角色拥有一个权限的集合。授权验证时,需要判断当前角色是否拥有该权限。 这种角色权限可以对该角色进行详细的权限描述, 适合更复杂的权限设计。下面将详细描述对两种角色模式的授权实现。2、授权实现Shiro支持三种方式实现授权过程:编码实现注解实现JSP Taglig 实现1.基于编码的授权实现1.1基于传统角色授权实现 当需要验证用户是否拥有某个角色时,可以调用Subject实例的hasRole

23、*方法验证。Java代码彪1.Subject currentUser = SecurityUtils.getSubject();2.if (currentUser.hasRole( administrator )3./show the admin button4. else 5./dont show the button? Grey it out?6.相关验证方法如下:1 Subject 方法描述hasRole(Stri ng roleName)当用户拥有指定角色时,返回 truehasRoles(List roleNames)按照列表顺序返回相应的一个 boolean值数组hasAIIRol

24、es(Collectio * Stri ng roleNames) 如果用户拥有所有指定角色时,返回 true断言支持Shiro还支持以断言的方式进行授权验证。断言成功,不返回任何值,程序继 续执行;断言失败时,将抛出异常信息。使用断言,可以使我们的代码更加简洁。Java 代码1.Subject currentUser = SecurityUtils.getSubject();2./guarantee that the current user is a bank teller and3./therefore allowed to open the account:4.currentUser.

25、checkRole( bankTeller );5.openBankAccount();断言的相关方法:Subject 方法描述checkRole(Stri ng roleName)断言用户是否拥有指定角色checkRoles(Collect ion roleNames)断言用户是否拥有所有指定角色checkRoles(Stri ng. roleNames)对上一方法的方法重载1.2基于权限角色授权实现相比传统角色模式,基于权限的角色模式耦合性要更低些, 它不会因角色的改变而对源代码进行修改,因此,基于权限的角色模式是更好的访问控制方式。它的代码实现有以下几种实现方式:1.2.1基于权限对象的

26、实现创建org.apache.shiro.authz.Permission的实例,将该实例对象作为参数传递给Subject.isPermitted ()进行验证。Java代码1. Permission printPermission = new PrinterPermission(jet4400n , print );laser2. Subject currentUser = SecurityUtils.getSubject();3.if(currentUser.isPermitted(printPermission) 4./show the Print button5.else 6./don

27、t show the button? Grey it out?7.8.Permission printPermission = new PrinterPermission(jet4400n , print );9.Subject currentUser = SecurityUtils.getSubject();laser10.if (currentUser.isPermitted(printPermission) 11./show the Print button12. else 13./dont show the button? Grey it out?14.相关方法如下:Subject 方

28、法1描述isPermitted(Permission p)Subject拥有制定权限时,返回 treuisPermitted(List perms)返回对应权限的 boolean数组isPermittedAII(Collectio n perms)Subject拥有所有制定权限时,返回 true1.2.2基于字符串的实现 相比笨重的基于对象的实现方式,基于字符串的实现便显得更加简洁。Java代码1.Subject currentUser = SecurityUtils.getSubject();2.if (currentUser.isPermitted( printer:print:laser

29、jet4400n)3./show the Print button4. else 5./dont show the button? Grey it out?6.使用冒号分隔的权限表达式是 org.apache.shiro.authz.permissi on. WildcardPermissi on 默认支持的实现方式。 这里分别代表了 资源类型:操作:资源 ID类似基于对象的实现相关方法,基于字符串的实现相关方法:isPermitted(String perm)、isPermitted(String. perms)、isPermittedAII(String. perms) 基于权限对象的断言

30、实现Java 代码 *1.Subject currentUser = SecurityUtils.getSubject();2./guarantee that the current user is permitted3./to open a bank account:4.Permission p = new AccountPermission( open);5.currentUser.checkPermission(p);6.openBankAccount();基于字符串的断言实现Java 代码1.Subject currentUser = SecurityUtils.getSubject();2./guarantee that the current user is permitted3./to open a bank account:4.currentUser.checkPermission( account:

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1