Spring Security教程之session管理(十一)

1.1     检测session超时

1.2     concurrency-control

1.3     session 固定攻击保护

Spring Security通过http元素下的子元素session-management提供了对Http Session管理的支持。

1.1     检测session超时

Spring Security可以在用户使用已经超时的sessionId进行请求时将用户引导到指定的页面。这个可以通过如下配置来实现。

<security:http>

...

<!-- session管理,invalid-session-url指定使用已经超时的sessionId进行请求需要重定向的页面 -->

<security:session-management invalid-session-url="/session_timeout.jsp"/>

...

</security:http>

需要注意的是session超时的重定向页面应当是不需要认证的,否则再重定向到session超时页面时会直接转到用户登录页面。此外如果你使用这种方式来检测session超时,当你退出了登录,然后在没有关闭浏览器的情况下又重新进行了登录,Spring Security可能会错误的报告session已经超时。这是因为即使你已经退出登录了,但当你设置session无效时,对应保存session信息的cookie并没有被清除,等下次请求时还是会使用之前的sessionId进行请求。解决办法是显示的定义用户在退出登录时删除对应的保存session信息的cookie。

<security:http>

...

<!-- 退出登录时删除session对应的cookie -->

<security:logout delete-cookies="JSESSIONID"/>

...

</security:http>

此外,Spring Security并不保证这对所有的Servlet容器都有效,到底在你的容器上有没有效,需要你自己进行实验。

1.2     concurrency-control

通常情况下,在你的应用中你可能只希望同一用户在同时登录多次时只能有一个是成功登入你的系统的,通常对应的行为是后一次登录将使前一次登录失效,或者直接限制后一次登录。Spring Security的session-management为我们提供了这种限制。

首先需要我们在web.xml中定义如下监听器。

<listener>

<listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>

</listener>

在session-management元素下有一个concurrency-control元素是用来限制同一用户在应用中同时允许存在的已经通过认证的session数量。这个值默认是1,可以通过concurrency-control元素的max-sessions属性来指定。

<security:http auto-config="true">

...

<security:session-management>

<security:concurrency-control max-sessions="1"/>

</security:session-management>

...

</security:http>

当同一用户同时存在的已经通过认证的session数量超过了max-sessions所指定的值时,Spring Security的默认策略是将先前的设为无效。如果要限制用户再次登录可以设置concurrency-control的error-if-maximum-exceeded的值为true。

<security:http auto-config="true">

...

<security:session-management>

<security:concurrency-control max-sessions="1" error-if-maximum-exceeded="true"/>

</security:session-management>

...

</security:http>

设置error-if-maximum-exceeded为true后如果你之前已经登录了,然后想再次登录,那么系统将会拒绝你的登录,同时将重定向到由form-login指定的authentication-failure-url。如果你的再次登录是通过Remember-Me来完成的,那么将不会转到authentication-failure-url,而是返回未授权的错误码401给客户端,如果你还是想重定向一个指定的页面,那么你可以通过session-management的session-authentication-error-url属性来指定,同时需要指定该url为不受Spring Security管理,即通过http元素设置其secure=”none”。

   <security:http security="none" pattern="/none/**" />

   <security:http>

      <security:form-login/>

      <security:logout/>

      <security:intercept-url pattern="/**" access="ROLE_USER"/>

      <!-- session-authentication-error-url必须是不受Spring Security管理的 -->

      <security:session-management session-authentication-error-url="/none/session_authentication_error.jsp">

         <security:concurrency-control max-sessions="1" error-if-maximum-exceeded="true"/>

      </security:session-management>

      <security:remember-me data-source-ref="dataSource"/>

   </security:http>

  

在上述配置中我们配置了session-authentication-error-url为“/none/session_authentication_error.jsp”,同时我们通过<security:http security="none" pattern="/none/**" />指定了以“/none”开始的所有URL都不受Spring Security控制,这样当用户进行登录以后,再次通过Remember-Me进行自动登录时就会重定向到“/none/session_authentication_error.jsp”了。

在上述配置中为什么我们需要通过<security:http security="none" pattern="/none/**" />指定我们的session-authentication-error-url不受Spring Security控制呢?把它换成<security:intercept-url pattern="/none/**"access="IS_AUTHENTICATED_ANONYMOUSLY"/>不行吗?这就涉及到之前所介绍的它们两者之间的区别了。前者表示不使用任何Spring Security过滤器,自然也就不需要通过Spring Security的认证了,而后者是会被Spring Security的FilterChain进行过滤的,只是其对应的URL可以匿名访问,即不需要登录就可访问。使用后者时,REMEMBER_ME_FILTER检测到用户没有登录,同时其又提供了Remember-Me的相关信息,这将使得REMEMBER_ME_FILTER进行自动登录,那么在自动登录时由于我们限制了同一用户同一时间只能登录一次,后来者将被拒绝登录,这个时候将重定向到session-authentication-error-url,重定向访问session-authentication-error-url时,经过REMEMBER_ME_FILTER时又会自动登录,这样就形成了一个死循环。所以session-authentication-error-url应当使用<security:http security="none" pattern="/none/**" />设置为不受Spring Security控制,而不是使用<security:intercept-url pattern="/none/**"access="IS_AUTHENTICATED_ANONYMOUSLY"/>。

此外,可以通过expired-url属性指定当用户尝试使用一个由于其再次登录导致session超时的session时所要跳转的页面。同时需要注意设置该URL为不需要进行认证。

   <security:http auto-config="true">

      <security:form-login/>

      <security:logout/>

      <security:intercept-url pattern="/expired.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY"/>

      <security:intercept-url pattern="/**" access="ROLE_USER"/>

      <security:session-management>

         <security:concurrency-control max-sessions="1" expired-url="/expired.jsp" />

      </security:session-management>

   </security:http>

  

1.3     session 固定攻击保护

session固定是指服务器在给客户端创建session后,在该session过期之前,它们都将通过该session进行通信。session 固定攻击是指恶意攻击者先通过访问应用来创建一个session,然后再让其他用户使用相同的session进行登录(比如通过发送一个包含该sessionId参数的链接),待其他用户成功登录后,攻击者利用原来的sessionId访问系统将和原用户获得同样的权限。Spring Security默认是对session固定攻击采取了保护措施的,它会在用户登录的时候重新为其生成一个新的session。如果你的应用不需要这种保护或者该保护措施与你的某些需求相冲突,你可以通过session-management的session-fixation-protection属性来改变其保护策略。该属性的可选值有如下三个。

l  migrateSession:这是默认值。其表示在用户登录后将新建一个session,同时将原session中的attribute都copy到新的session中。

l  none:表示继续使用原来的session。

l  newSession:表示重新创建一个新的session,但是不copy原session拥有的attribute。

(注:本文是基于Spring Security3.1.6所写)

--------------------------------

作者:lanfeng2291564

来源:博客园

地址:https://www.cnblogs.com/fenglan/p/5913352.html

原文地址:https://www.cnblogs.com/ryelqy/p/10283495.html

时间: 2024-12-16 15:56:42

Spring Security教程之session管理(十一)的相关文章

Spring Security教程之Jsp标签(四)

目录 1.1     authorize 1.2     authentication 1.3     accesscontrollist Spring Security也有对Jsp标签的支持的标签库.其中一共定义了三个标签:authorize.authentication和accesscontrollist.其中authentication标签是用来代表当前Authentication对象的,我们可以利用它来展示当前Authentication对象的相关信息.另外两个标签是用于权限控制的,可以

Spring进阶教程之在ApplicationContext初始化完成后重定义Bean

之前遇到一个很有意思的问题:我需要批量重定义特定类型的由Spring容器托管的Bean.具体体现在,我有很多控制器类(Controller)和校验器类(Validator),我希望他们都是多例(Prototype)的,而Spring默认创建实例是单例(Singleton)的.有朋友可能要问:为什么不自己在Bean定义时加参数呢@Scope("prototype")?我的回答很简单:懒…….因为我的Bean声明是这样的: 那么我就没法很精确得去设置控制器和校验器的类实例为多例,因为我这里

Spring Security技术栈开发企业级认证与授权

Spring Security技术栈开发企业级认证与授权网盘地址:https://pan.baidu.com/s/1mj8u6JQ 密码: 92rp备用地址(腾讯微云):https://share.weiyun.com/8b2ffc1839069b4399950333860754a4 密码:a539tn 第1章 课程导学介绍课程内容.课程特点,使用的主要技术栈,以及学习课程所需的前置知识 第2章 开始开发安装开发工具,介绍项目代码结构并搭建,基本的依赖和参数设置,开发hello world 第3

spring security控制session

spring security控制session本文给你描述在spring security中如何控制http session.包括session超时.启用并发session以及其他高级安全配置. 创建session时机我们可以准确地控制什么时机创建session,有以下选项进行控制: always – 如果session不存在总是需要创建: ifRequired – 仅当需要时,创建session(默认配置): never – 框架从不创建session,但如果已经存在,会使用该session

Spring Security入门(3-5)Spring Security 的鉴权 - 决策管理器和投票器

1.决策管理器的运行原理: 2.Spring Security提供的决策管理器实现 3.用户自定义的决策管理器

[转]Spring Security学习总结一

[总结-含源码]Spring Security学习总结一(补命名空间配置) Posted on 2008-08-20 10:25 tangtb 阅读(43111) 评论(27)  编辑  收藏 所属分类: Spring .Spring Security Spring Security学习总结一 在认识Spring Security之前,所有的权限验证逻辑都混杂在业务逻辑中,用户的每个操作以前可能都需要对用户是否有进行该项 操作的权限进行判断,来达到认证授权的目的.类似这样的权限验证逻辑代码被分散

Spring Security应用开发(14) 重要概念之授权相关概念

1.1.1. Secure Object Secure Object指的是一个Method Invovation 或者一个URL资源. 1.1.2. GrantedAuthority GrantedAuthority用于表达指定的用户获得的权限(即角色名称). public interface GrantedAuthority extends Serializable { //返回一个表达已经经过授权的字符串. //如果不符合授权条件则返回null. String getAuthority();

Spring security 3 非常全的文档 API 中文版

Spring Security 安全权限管理手册 序言 I. 基础篇 6.1. MD5加密 6.2. 盐值加密 6.3. 用户信息缓存 6.4. 获取当前用户信息 5.1. 数据库表结构 5.2. 初始化数据 5.3. 实现从数据库中读取资源信息 5.3.1. 需要何种数据格式 5.3.2. 替换原有功能的切入点 4.1. 实现自定义登陆页面 4.2. 修改配置文件 4.3. 登陆页面中的参数配置 4.4. 测试一下 3.1. 自定义表结构 3.2. 初始化数据 3.3. 获得自定义用户权限信息

Spring Security 入门(三)

在说完了Spring Security框架的功能和执行流程后,就到了写它Spring Boot的集成,先来看最简的配置: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.6.RELEASE</version> </parent>