`
peterwanghao
  • 浏览: 128290 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Apache Shiro 会话与主体状态的关系

 
阅读更多

有状态的应用程序

默认情况下ShiroSecurityManager实例会使用一个SubjectSession存储Subject的身份IDPrincipalCollection)和验证状态(subject.isAuthenticated())。这通常发生在一个Subject登录后或当一个Subject的身份ID通过Remember服务后。

使用这种默认方式的好处是:

l任何应用都可通过SessionID来关联请求/调用/消息,并且这是关联用户所必需的。例如,使用Subject.Builder来获取相关的Subject

SerializablesessionId=//getfromtheinboundrequestorremotemethodinvocationpayload

SubjectrequestSubject=newSubject.Builder().sessionId(sessionId).buildSubject();

l任何"RememberMe"身份能够在第一次访问时就能持久化到会话的初始请求。这确保了Subject被记住的身份可以跨请求保存而不需要反序列化及将它解释到每个请求。例如,在一个Web应用程序中,没有必要去读取每一个请求的加密RememberMeCookie,如果该身份在会话中是已知的。这可是一个很好的性能提升。

无状态的应用程序

虽然上述的默认策略对于大多数应用程序而言是很好的(通常是可取的),但这对于无状态的应用程序来说是不合适的。许多无状态的架构规定在请求中不能存在持久状态,这种情况下的Sessions不会被允许(一个会话其本质代表了持久状态)。

但这一要求带来一个便利的代价——Subject状态不能跨请求保留。这意味着有这一要求的应用程序必须确保Subject状态可以在每一个请求中以其他的方式代表。

这几乎总是通过验证每个由应用程序处理的请求/调用/消息来完成的。例如,大多数无状态Web应用程序通常支持这一点通过执行HTTP基本验证,允许浏览器验证每一个代表最终用户的请求。远程或消息框架必须确保Subject的身份和凭证连接到每一个调用或消息的有效载荷,通常是由框架代码执行。

在无状态应用中需要禁用将Subject状态持久化到会话,可通过如下配置实现:

[main]

securityManager.subjectDAO.sessionStorageEvaluator.sessionStorageEnabled=false

需要注意的是,禁用使用Sessions作为存储策略的实现,但它没有完全地禁用Sessions。如果你的任何代码显式地调用subject.getSession()subject.getSession(true),一个session仍然会被创建。

混合方法

但,如果你想使用混合的方法呢?如果某些对象应该有会话而某些没有?这种混合法方法能够给许多应用程序带来好处。例如:

l也许humanSubject(如Web浏览器用户)由于上面提供的好处能够使用Session

l也许non-humanSubject(如API客户端或第三方应用程序)不应该创建session由于它们与软件的交互可能会间歇或不稳定。

l也许所有某种确定类型的Subject或从某一确定位置访问系统的应该将状态保持在会话中,但所有其他的不应该。

如果你需要这个混合方法,你可以实现一个SessionStorageEvaluator接口,告诉Shiro哪个Subject支持会话存储。

该接口只有一个方法:

publicinterfaceSessionStorageEvaluator{

publicbooleanisSessionStorageEnabled(Subjectsubject);

}

例如,在Web应用程序中,如果该决定必须基于当前ServletRequest中的数据,你可以获取该request或该response,因为运行时的Subjce实例实际上就是一个WebSubject实例:

publicbooleanisSessionStorageEnabled(Subjectsubject){

booleanenabled=false;

if(WebUtils.isWeb(Subject)){

HttpServletRequestrequest=WebUtils.getHttpRequest(subject);

//set'enabled'basedonthecurrentrequest.

}else{

//notawebrequest-maybeaRMIordaemoninvocation?

//set'enabled'anotherway…

}

returnenabled;

}

在你实现了SessionStorageEvaluator接口后,你可以在shiro.ini中配置它:

[main]

sessionStorageEvaluator=com.mycompany.shiro.subject.mgt.MySessionStorageEvaluator

securityManager.subjectDAO.sessionStorageEvaluator=$sessionStorageEvaluator

...

WEB应用

通常Web应用程序希望在每一个请求的基础上容易地启用或禁用会话的创建,不管是哪个Subject正在执行请求。这经常在支持RESTMessaging/RMI构架上使用来产生很好的效果。例如,也许正常的终端用户(使用浏览器的人)被允许创建和使用会话,但远程的API客户端使用RESTSOAP,不该拥有会话(因为它们在每一个请求上验证,常见REST/SOAP体系结构)。

为了支持这种hybrid/per-request的能力,noSessionCreation过滤器被添加到Shiro的默认为Web应用程序启用的“池”。该过滤器将会阻止在请求期间创建新的会话来保证无状态的体验。在shiro.ini[urls]项中,你通常定义该过滤器在所有其它过滤器之前来确保会话永远不会被使用。

例如:

[urls]

/rest/**=noSessionCreation,authcBasic,...

这个过滤器允许现有会话的任何会话操作,但不允许在过滤的请求创建新的会话。也就是说,一个请求或没有会话存在的Subject调用下面四个方法中的任何一个时,将会自动地触发一个DisabledSessionException异常:

lhttpServletRequest.getSession()

lhttpServletRequest.getSession(true)

lsubject.getSession()

lsubject.getSession(true)

如果一个Subject在访问noSessionCreation-protected-URL之前已经有一个会话,则上述的四种调用仍然会如预期般工作。

最后,在所有情况下,下面的调用将始终被允许:

lhttpServletRequest.getSession(false)

l subject.getSession(false)

分享到:
评论

相关推荐

    Apache Shiro教程

    Apache Shiro是一个强大的Java安全框架,它为应用程序提供了身份验证、授权、会话管理和加密等功能。这个教程将帮助你深入理解和有效地使用Shiro框架。在本文中,我们将详细探讨Shiro的核心概念、主要功能和常见用法...

    Apache shiro 1.13.0源码

    Apache Shiro 是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,简化了企业级应用的安全实现。Shiro 1.13.0 是其一个重要的版本,包含了多项更新和改进。在这个版本中,开发者可以深入理解其...

    Apache_Shiro_使用手册(一)Shiro架构介绍

    Apache Shiro 是一款功能强大且易于使用的 Java 安全框架,它提供了多种安全相关的功能和服务,包括但不限于认证、授权、加密和会话管理。相较于其他安全框架,Shiro 在设计上更为简洁明了,便于开发者的理解和使用...

    Apache Shiro中文版使用手册

    Apache Shiro 是一款强大的 Java 安全框架,它集成了认证、授权、加密和会话管理等功能。这些功能使得 Shiro 成为了一个全面的安全解决方案,适用于各种类型的应用程序。 - **认证**:是指确认用户的身份,通常指的...

    apache-shiro教程完整版.7z

    Apache Shiro 是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,可以非常轻松地开发出足够安全的应用。张开涛的《跟我学Shiro》是一本深入浅出的教程,旨在帮助读者快速掌握Shiro的核心概念...

    shiro-all jar

    6. **org.apache.shiro.session**: 会话管理模块,负责用户的会话状态维护,可以跨应用和服务器集群共享会话信息。 7. **org.apache.shiro.subject**: Shiro的核心概念,代表当前操作的主体(如用户),包括其认证...

    apache shiro中文教程

    Apache Shiro是一个开源的安全框架,它提供了一套简单的API来处理身份验证、授权、会话管理和加密。Shiro的功能强大且灵活,目标是使安全任务的处理变得简单易行。 首先,Shiro的介绍部分涵盖了基本概念和术语,如...

    Apache Shiro 使用分享

    Apache Shiro 是一个强大且易用的Java安全框架,它提供了认证、授权、加密和会话管理功能,简化了企业级应用的安全实现。在本文中,我们将深入探讨Apache Shiro的核心概念、主要功能以及如何在实际项目中进行使用。 ...

    Apache Shiro 身份认证例子-源码

    Apache Shiro 是一个强大且易用的 Java 安全框架,它提供了身份认证、授权、加密和会话管理功能,让开发人员可以轻松地在应用中处理安全性问题。本资源包含了一个 Apache Shiro 的身份认证例子的源码,这对于理解和...

    Apache shiro 标签授权

    Apache Shiro 是一款功能强大的 Java 安全框架,提供了认证、授权、加密及会话管理等功能,可以帮助开发者非常容易地开发出足够安全的应用。其中,Shiro 提供了一系列 JSP 标签库来实现页面级别的授权控制。本文将...

    Apache_Shiro_使用手册

    Apache Shiro 是一个轻量级的 Java 安全框架,主要负责处理认证、授权、加密和会话管理等核心安全任务。它旨在简化应用程序的安全实现,对比其他如 Spring Security 的框架,Shiro 更加易于理解和使用。 **认证过程...

    Apache_Shiro中文开发说明文档.docx

    Shiro还提供了会话管理功能,可以设置会话超时、分布式会话支持等,确保用户状态的一致性。 总之,Apache Shiro 是一个功能丰富的Java安全框架,通过简单的API,开发者可以快速地在应用中实现安全控制,提升系统的...

    shiro基础jar包

    Apache Shiro 是一个强大且易用的 Java 安全框架,提供身份认证、授权、会话管理和加密等核心功能。Shiro 可以被轻松地应用于任何 Java 应用程序,从小型的命令行应用程序到大型的 Web 应用。在深入探讨 Shiro 的...

    shiro获取登录状态和用户信息

    ### Shiro 获取登录状态与用户信息 在Java Web开发领域,Apache Shiro 是一个非常流行的权限管理框架。它提供了一套完整的认证、授权、加密和会话管理功能。本篇文章将详细介绍如何通过Shiro框架来获取用户的登录...

    apache-shiro 学习笔记

    Apache Shiro 是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,可以非常轻松地开发出足够安全的应用。Shiro 不仅可以用于Java Web 应用,也可以在 Java Desktop 或者是其他Java 应用中使用...

    shiro 权限与角色

    Apache Shiro 是一款轻量级的安全框架,广泛应用于Java领域,提供身份认证、授权(权限管理)、会话管理和加密等功能。在"shiro权限与角色"这个主题中,我们将深入探讨Shiro如何处理用户权限和角色,以及如何在实际...

    最新权限框架shiro视频

    在本篇内容中,我们将基于提供的“最新权限框架Shiro视频”的信息,深入探讨与Apache Shiro相关的多个重要知识点。Apache Shiro是一个强大且易用的Java安全框架,提供了认证、授权、加密以及会话管理功能,使用它...

    Shiro 视频教程+源码+课件

    Apache Shiro 是目前使用率较高的一个 Java 安全框架。本视频基于 Shiro 的新版本 1.3.2 录制。内容涵盖 Shiro 认证、加密、授权、安全标签、安全注解、会话管理、缓存、Rememberme 等 JavaEE 企业级开发的核心技术...

Global site tag (gtag.js) - Google Analytics