`
Wind_ZhongGang
  • 浏览: 264865 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Spring Security 之 Session Management

 
阅读更多

     Spring  Security为我们提供了SessionAuthenticationStrategy接口来定制针对Session的一些特殊管理,如防Session的固定攻击, 防Session的单用户多次登陆等, 这些特殊的管理功能Spring Security都为我们提供了相应的类,如下示:


      1. SessionFixationProtectionStrategy, 这个实现SessionAuthenticationStrategy的类是用于防止Session的固定攻击的

 

      这里先从Session的固定攻击说起, 话说什么是Session的固定攻击呢, 当我们尝试登录时, Spring Security会为我们创建一个Session, 并将SessionId放置在Cookie或URL中, 如果没有使用Spring Security的防Session固定攻击的功能的话, 当用户登录成功后, 这个SessionId是不会改变的, 如果在登录前这个SessionId就因为某种原因而被窃取了,那就会让别有用心者在不知道用户账户的情况下, 通过使用SessionId来达到查看需用户登录的资源。 那么Spring Security又是如何来解决这个问题的呢, 办法很简单, 在用户登录成功后重新创建一个Session, 并将旧有Session的信息转移到新建的Session中, 当然这是可选的, 至于你想不想转移这些信息或者转移哪些信息这些都是可以选择的, 可由用户自主选择。

 

      源码解释

 

    //是否需要转移Session中的值
    private boolean migrateSessionAttributes = true;

    //需要转移的Session中的值的列表
    private List<String> retainedAttributes = null;

    //是否创建新的Session
    private boolean alwaysCreateSession;

    //该方法是实现Session管理的主方法, 也就是SessionAuthenticationStrategy接口中的方法
    public void onAuthentication(Authentication authentication, HttpServletRequest request, HttpServletResponse response) {
        boolean hadSessionAlready = request.getSession(false) != null;
        //如果没有Session存在则返回不做处理
        if (!hadSessionAlready && !alwaysCreateSession) {
            

            return;
        }

        // 创建一个Session
        HttpSession session = request.getSession();

        if (hadSessionAlready && request.isRequestedSessionIdValid()) {
            // We need to migrate to a new session
            String originalSessionId = session.getId();

            if (logger.isDebugEnabled()) {
                logger.debug("Invalidating session with Id '" + originalSessionId +"' " + (migrateSessionAttributes ?
                        "and" : "without") +  " migrating attributes.");
            }

            Map<String, Object> attributesToMigrate = extractAttributes(session);

            session.invalidate();
            session = request.getSession(true); // we now have a new session

            if (logger.isDebugEnabled()) {
                logger.debug("Started new session: " + session.getId());
            }

            if (originalSessionId.equals(session.getId())) {
                logger.warn("Your servlet container did not change the session ID when a new session was created. You will" +
                        " not be adequately protected against session-fixation attacks");
            }
            //转移Session中的属性值
            transferAttributes(attributesToMigrate, session);
	    //Session转移后需要做的额外工作, 当前类中的方法为空方法,可由用户自主实现
            onSessionChange(originalSessionId, session, authentication);
        }
    }
 


      2. ConcurrentSessionControlStrategy这个类是用于防止Session的单用户多次登陆的, 值得一提的是ConcurrentSessionControlStrategy是SessionFixationProtectionStrategy的子类,所以SessionFixationProtectionStrategy类也具有防Session的固定攻击的功能

 

      在没有这个辅助类的情况下, 有这样一种情况我们无法避免, 那就是同一个用户在不同机器的不同浏览器上可以进行多次登录, 如果我们希望杜绝这种情况的发生, 就需要使用到这个类, 用来控制同一个用户同一时刻最多的登录次数, 如果设置maximumSessions为1, 表时只希望用户在同一时刻只能登录一次。那么Spring Security又是如何控制用户登录次数的呢, 这就需要讲到sessionRegistry这个接口了, 它有个默认实现SessionRegistryImpl, 当用户登录成功后,会调用registerNewSession方法,将当前用户登录的一些基本信息如SessionId, 用户名等放置在内存中, 那么当同一用户再次登录时, 会调用sessionRegistry的getAllSessions方法, 获取登录用户的登录次数, 再与设置的最大次数比较就可以知道用户是否超出了登录限制。sessionRegistry的getAllPrincipals方法可以得到当前系统中的已登录用户,即在线用户,这非常有用。

 

      SessionRegistry源码

 

package org.springframework.security.core.session;

import java.util.List;

/**
 * Maintains a registry of <code>SessionInformation</code> instances.
 *
 * @author Ben Alex
 */
public interface SessionRegistry {
    //获取当前系统的在线用户
    List<Object> getAllPrincipals();

    //根据传入的用户名参数, 获取当前用户的登录信息列表
    List<SessionInformation> getAllSessions(Object principal, boolean includeExpiredSessions);

    //根据SessionId, 获取Session的基本信息,如最后一次访问时间,是否过期等
    SessionInformation getSessionInformation(String sessionId);

    //根据SessionId,更新最后访问时间
    void refreshLastRequest(String sessionId);

    //登录成功后注册一个新的SessionInformation到内存中
    void registerNewSession(String sessionId, Object principal);

    //根据SessionId移除SessionInformation
    void removeSessionInformation(String sessionId);
}
 

 

      3. Spring Security还为我们提供了一个类叫NullAuthenticatedSessionStrategy,查看源码可以发现只有一个空的方法实现, 从类名也可顾名思义,知道这个类的作用就是什么事也不做

分享到:
评论
1 楼 jackyrong 2013-04-15  
  <beans:property name="maximumSessions" value="1" />
      <beans:property name="exceptionIfMaximumExceeded" value="true" />
使用这两个,可以放置不同浏览器用同一个账号登录,
但有无办法放置同一个浏览器中,开多个窗口,用同一个账号登录呢?

相关推荐

    spring security 3.x session-management 会话管理失效

    - 在Spring Security的XML配置文件中,`&lt;http&gt;`元素下的`&lt;session-management&gt;`用于配置会话管理。例如,可以添加`&lt;concurrency-control&gt;`子元素来设置并发会话策略。 - `&lt;session-management&gt;`还可以配置`...

    springsecurity学习笔记

    在"springsecurity学习笔记"中,你可能会涉及以下主题: - Spring Security的基本配置,包括web安全配置和全局安全配置。 - 如何自定义认证和授权流程,比如实现自定义的AuthenticationProvider和...

    spring security 官方文档

    4. **会话管理(Session Management)**:Spring Security提供了强大的会话管理功能,可以限制同一用户同时在线的数量,检测会话劫持和会话固定攻击,并能实现会话超时策略。 5. **CSRF保护(Cross-Site Request ...

    利用spring security控制同一个用户只能一次登陆

    .sessionManagement() .maximumSessions(1) // 设置最大会话数为1 .sessionRegistry(sessionRegistry) .sessionAuthenticationStrategy(mySessionAuthenticationStrategy); // 其他配置... } } ``` 5. **通知...

    spring-security 官方文档 中文版

    Spring Security 是一款基于 Spring 框架的安全插件,提供了完整的安全性解决方案,包括身份认证(Authentication)、授权(Authorization)以及会话管理(Session Management)等功能。Spring Security 的设计目标是为...

    spring security 3 demos

    4. **会话管理(Session Management)**:Spring Security 提供了会话管理和会话固定防护功能。在demos中,你可以了解如何配置会话超时、跨站点请求伪造(CSRF)防护,以及如何防止会话固定攻击。 5. **异常处理...

    springsecurity3.1.pdf

    标题:springsecurity3.1.pdf 描述:springsecurity3.1.pdf 标签:spring security3.1 部分内容:SpringSecurity Reference Documentation by Ben Alex and Luke Taylor 3.1.4.RELEASE **一、Spring Security 3.1...

    Spring Security 3 中文 chm

    6. **会话管理(Session Management)**:Spring Security 提供了会话管理功能,包括会话固定保护、会话超时和并发会话控制,防止会话劫持和会话固定攻击。 7. **CSRF(跨站请求伪造)防护**:Spring Security 自动...

    SpringSecurity素材.zip

    5. **会话管理(Session Management)**:SpringSecurity可以控制会话的创建、生命周期和并发控制,防止会话固定攻击(Session Fixation)和会话劫持(Session Hijacking)。 6. **CSRF防护(Cross-Site Request ...

    springsecurity3.0.5应用

    5. **Session Management**:Spring Security提供了会话管理策略,如限制同一用户并发会话的数量,防止会话固定攻击。 6. **CSRF防护**:为防止跨站请求伪造(Cross-Site Request Forgery)攻击,Spring Security...

    spring security用户权限项目

    5. **会话管理(Session Management)**:Spring Security 可以配置会话超时、会话固定攻击防护等策略,保护用户会话的安全。 **Spring MVC 知识点** 1. **DispatcherServlet**:作为 Spring MVC 的核心,它负责...

    Spring Security2中设置Cookie的保存时间

    在Spring Security 2中,配置Cookie的保存时间是一项重要的任务,因为这关乎到用户的会话持久性和安全性。Cookie是Web应用程序中用于存储用户状态的一种机制,例如登录信息、个性化设置等。正确设置Cookie的生命周期...

    Spring Security 3全文下载

    - **Session Management**:Spring Security提供了会话固定保护,防止会话劫持和会话超时等安全问题。 - **Concurrent Session Control**:可以限制同一用户同时登录的会话数量,防止账户被非法使用。 5. **CSRF...

    spring security3笔记

    - **Session Management**:控制会话生命周期,如会话固定策略和并发会话控制。 5. **AOP安全** - **方法安全**:Spring Security使用AOP(面向切面编程)在方法级别实现权限控制。 - **表达式式访问控制**:...

    Spring Security 权限控制中文API

    6. **会话管理(Session Management)**:Spring Security 还提供了会话管理功能,可以防止会话固定攻击(Session Fixation),并支持会话超时和并发会话控制。 7. **CSRF(跨站请求伪造)防护**:默认情况下,...

    spring security2配置

    通过`http.sessionManagement()`,我们可以设置会话策略,如`maximumSessionMax(1)`限制用户只能同时有一个会话。 6. **异常处理**:当用户尝试访问未授权的资源时,Spring Security 将抛出`AccessDeniedException`...

    Spring security-包含官方文档

    7. **Session Management**:Spring Security 可以控制会话的最大并发数量,防止会话固定攻击,并提供会话超时和会话劫持的防护。 8. **国际化**:Spring Security 支持多语言,可以在认证失败和权限不足时显示不同...

    spring security安全框架

    6. **Session Management**:Spring Security 可以帮助管理会话,防止会话固定攻击和会话劫持。 现在,让我们通过一个简单的 Spring Security Demo 来了解其基本配置和使用: 1. **添加依赖**:在 Maven 或 Gradle...

    springsecurity例子

    这个压缩包文件"springsecurity"很可能包含了一个Spring Security的示例项目,让我们来深入探讨一下Spring Security的相关知识点。 1. **Spring Security架构**: Spring Security的核心组件包括过滤器链、安全性...

    利用Spring Security做角色权限校验

    它主要包括四个主要组件:认证(Authentication)、授权(Authorization)、访问决策管理(Access Decision Management)和会话管理(Session Management)。在Spring Security中,认证是指确定用户是谁,而授权则是...

Global site tag (gtag.js) - Google Analytics