`
234390216
  • 浏览: 10229853 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A5ee55b9-a463-3d09-9c78-0c0cf33198cd
Oracle基础
浏览量:462460
Ad26f909-6440-35a9-b4e9-9aea825bd38e
springMVC介绍
浏览量:1775244
Ce363057-ae4d-3ee1-bb46-e7b51a722a4b
Mybatis简介
浏览量:1398180
Bdeb91ad-cf8a-3fe9-942a-3710073b4000
Spring整合JMS
浏览量:394948
5cbbde67-7cd5-313c-95c2-4185389601e7
Ehcache简介
浏览量:679879
Cc1c0708-ccc2-3d20-ba47-d40e04440682
Cas简介
浏览量:530772
51592fc3-854c-34f4-9eff-cb82d993ab3a
Spring Securi...
浏览量:1183597
23e1c30e-ef8c-3702-aa3c-e83277ffca91
Spring基础知识
浏览量:467458
4af1c81c-eb9d-365f-b759-07685a32156e
Spring Aop介绍
浏览量:151279
2f926891-9e7a-3ce2-a074-3acb2aaf2584
JAXB简介
浏览量:68022
社区版块
存档分类
最新评论

Spring Security(13)——session管理

阅读更多

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 Securitysession-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-controlerror-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-exceededtrue后如果你之前已经登录了,然后想再次登录,那么系统将会拒绝你的登录,同时将重定向到由form-login指定的authentication-failure-url。如果你的再次登录是通过Remember-Me来完成的,那么将不会转到authentication-failure-url,而是返回未授权的错误码401给客户端,如果你还是想重定向一个指定的页面,那么你可以通过session-managementsession-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 SecurityFilterChain进行过滤的,只是其对应的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-managementsession-fixation-protection属性来改变其保护策略。该属性的可选值有如下三个。

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

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

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

 

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

(注:原创文章,转载请注明出处。原文地址:http://elim.iteye.com/blog/2208429

 

 

 

 

4
0
分享到:
评论
2 楼 wangviviying 2016-10-17  
补充一下
Defaults to
"changeSessionId" in Servlet 3.1 and newer containers, "migrateSession" in older containers.
1 楼 wangviviying 2016-10-17  
l  newSession:表示重新创建一个新的session,但是不copy原session拥有的attribute。
不对。
"newSession" will create a new empty session, with only
Spring Security-related attributes migrated.

相关推荐

    SpringBoot集成Spring Security登录管理 添加 session 共享【完整源码+数据库】

    我们将基于给定的标签——SpringBoot、SpringSecurity、mysql、session共享和idea来构建一个完整的示例。 首先,SpringBoot是一个轻量级的Java框架,它简化了创建独立的、生产级别的基于Spring的应用程序。通过内置...

    spring security4登陆例子

    本文将通过一个具体的示例——Spring MVC + Spring Security 4 的整合登录实例来深入探讨Spring Security的使用方法。 #### 二、核心配置类:`SecurityConfig` 在本例中,我们使用的是Java Config的方式进行Spring...

    Spring Security3.pdf

    此外,Spring Security还提供了会话管理功能,包括会话固定保护(Session Fixation Protection)和会话超时管理。会话固定保护能防止会话劫持攻击,而会话超时则有助于防止未授权的长时间访问。 Spring Security3也...

    SpringSecurity 3.0.1.RELEASE.CHM

    1.1. Spring Security是什么? 1.2. 历史 1.3. 发行版本号 1.4. 获得Spring Security 1.4.1. 项目模块 1.4.1.1. Core - spring-security-core.jar 1.4.1.2. Web - spring-security-web.jar 1.4.1.3. Config -...

    spring-security-core-2.0.6.RELEASE

    4. **会话管理**:Spring Security还提供了会话管理功能,如会话固定攻击防护(Session Fixation Protection)和会话超时设置。 五、扩展性与定制化 Spring Security设计得非常灵活,允许开发者通过实现或扩展其...

    Jsf整合三大框架及Spring Security

    通过这样的整合,开发者可以构建出一个健壮、可扩展且易于维护的Web应用程序,利用JSF的组件模型,Spring的强大功能,Hibernate的数据管理,PrimeFaces的UI设计,以及Spring Security的安全保障,为企业级应用开发...

    SpringSecurity笔记

    1. **创建项目结构**:首先创建一个父工程,如 "Spring-Security",然后在其中创建子模块,用于管理和组织各个组件。 2. **创建 Spring Boot 工程**:在 "Spring-Security" 父工程下创建一个新的 Spring Boot 工程...

    crafter-profile-spring-security-provider-2.3.3.zip

    5. **会话管理(Session Management)**:Spring Security提供会话管理功能,可以防止会话固定攻击(Session Fixation)和并发会话控制(Concurrent Session Control)。 6. **密码存储与加密(Password Storage & ...

    Java WEB——人事管理系统

    《Java WEB——人事管理系统》 Java WEB技术在企业级应用中占据着重要的地位,尤其在构建人事管理系统这类业务逻辑复杂的系统时,其优势尤为明显。本文将深入探讨Java WEB技术在人事管理系统中的应用,以及相关的...

    security-demo

    本项目“security-demo”旨在展示如何将Java领域的四大核心框架——SpringBoot、SpringSecurity、SpringSession以及Redis相结合,构建一个高效、安全的Web应用程序。以下是对这些技术及其整合方式的详细解释。 1. *...

    SpringMVC精品资源-- 基于Layui+Spring开发的权限管理框架.zip

    【SpringMVC精品资源——基于Layui+Spring开发的权限管理框架】 SpringMVC是Spring框架的一个模块,专门用于构建Web应用程序。它提供了一种模型-视图-控制器(MVC)架构,使得开发者可以将业务逻辑、数据处理和用户...

    spring实现的网上书店

    2. **会话管理**:Spring Session提供了一种跨服务器共享session的解决方案,这对于多服务器部署的大型应用非常重要。 3. **购物车**:这通常涉及到状态管理,用户添加商品到购物车,修改数量,或者移除商品,这些...

    spring 登陆功能 小案例

    - Spring Security自动处理登录状态的保持,使用基于cookie的session管理。用户登录后,Spring Security会在用户的浏览器上设置一个JSESSIONID cookie。 9. **异常处理**: - 对于可能出现的异常,如用户名不存在...

    超市订单管理系统——SSM实现

    这可能涉及到session管理、权限认证(如基于Spring Security)以及敏感信息加密等技术。 7. **异常处理与日志记录**:为了保证系统的稳定性和可追溯性,系统应包含完善的异常处理机制和日志记录功能。通过记录操作...

    基于Hibernate,Spring,Spring mvc,Bootstrap的管理系统实现

    【描述】: 这个管理系统实现项目是利用Java技术栈中的核心组件——Hibernate、Spring和Spring MVC,结合前端Bootstrap框架,构建的一个高效、易用的企业级应用。Hibernate作为持久层框架,负责对象关系映射(ORM),...

    一些常用的有关java的chm文档

    在给定的压缩包“一些常用的有关java的chm文档”中,包含了一个名为“SpringSecurity 安全权限管理手册”的CHM文档,这暗示了我们将探讨的是Java生态中的一个重要领域——Spring Security。 Spring Security是...

    SpringRecipes

    - **Hibernate集成**:展示了如何将Spring与Hibernate集成起来,利用Spring管理Hibernate的Session和事务,以及如何使用Spring Data JPA等高级特性。 4. **远程服务与消息传递** - **远程服务调用**:介绍了如何...

    smartGwt、spring、Mybatis整合

    登录成功后,Spring Security会创建一个Authentication对象并存储在session中,以进行后续的权限检查。 这个项目"SmartGwtDemo"可能包含了相关的源代码、配置文件和数据库脚本,帮助开发者理解如何将这三个框架有效...

    内容管理系统(hibernate3+struts2+spring2).rar

    本系统采用经典的Java技术栈——Spring、Struts2和Hibernate(SSH)进行构建,这三大框架的组合在Java Web开发中具有广泛的应用。 首先,让我们深入理解SSH框架的核心特性: 1. **Spring框架**:Spring作为一款轻...

    权限管理系统demo.rar

    本文将基于"权限管理系统demo.rar"这一压缩包中的资源,深入探讨两个流行的Java权限管理框架——Apache Shiro和Spring Security,并介绍如何实现权限控制。 Apache Shiro是一款强大且易用的Java安全框架,它提供...

Global site tag (gtag.js) - Google Analytics