zoukankan      html  css  js  c++  java
  • spring security控制session


    spring security控制session
    本文给你描述在spring security中如何控制http session。包括session超时、启用并发session以及其他高级安全配置。

    创建session时机
    我们可以准确地控制什么时机创建session,有以下选项进行控制:

    always – 如果session不存在总是需要创建;
    ifRequired – 仅当需要时,创建session(默认配置);
    never – 框架从不创建session,但如果已经存在,会使用该session ;
    stateless – Spring Security不会创建session,或使用session;

    java config配置方式如下:

    @Override
    protected void configure(HttpSecurity http) throws Exception {
    http.sessionManagement()
    .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
    }


    该配置仅控制spring security做什么,不是整个应用,根据配置spring security可能不创建session,但我们的应用可以创建session。理解这点很重要。

    缺省值“ifRequired”,spring security根据需要创建session。

    对于大多数无状态应用,“never”选项确保spring security自身不创建任何session;然而,如果应用自己创建session,那么spring security会使用它。

    最后,最严格session创建选项是“stateless”,其确保应用也不会创建任何session。从spring3.1开始引入,将影响跳过部分spring security过滤器——主要与session相关的,如HttpSessionSecurityContextRepository, SessionManagementFilter, RequestCacheFilter。

    这些大多数严格控制机制直接暗示cookies不被使用,每个请求需要被认证。无状态的体系结构与REST api及它们的无状态约束很好地发挥了作用。在Basic和Digest认证中也可以很好工作。

    深入理解
    在执行认证过程之前,spring security将运行SecurityContextPersistenceFilter过滤器负责存储安请求之间的全上下文,上下文根据策略进行存储,默认为HttpSessionSecurityContextRepository ,其使用http session作为存储器。

    对于严格的创建session选项“stateless”,使用另一个存储策略—— NullSecurityContextRepository,没有session被创建或使用,用于保存上下文。

    并发session控制
    当已经认证过的用户尝试再次认证时,应用针对该事件有几种处理方式。可以注销当前用户session,使用新的session重新认证,或允许两个session并存。
    启用并发session控制,首先需要在配置中增加下面监听器:

    @Bean
    public HttpSessionEventPublisher httpSessionEventPublisher() {
    return new HttpSessionEventPublisher();
    }


    其本质是确保当session被销毁时,通知spring security session注册器。
    在这种场景下,允许同一用户拥有多个并发session,配置如下:

    @Override
    protected void configure(HttpSecurity http) throws Exception {
    http.sessionManagement().maximumSessions(2)
    }


    session超时
    session已经超时后,如果用户使用已经过期的sessionid发送请求,则会被重定向至指定url;同样如果使用未过期但完全无效的sessionid用户发送请求,也会被重定向至特定url,配置如下:

    http.sessionManagement()
    .expiredUrl("/sessionExpired.html")
    .invalidSessionUrl("/invalidSession.html");

    防止使用url参数进行session跟踪
    在url中暴露session信息会增加安全风险,自spring3.0开始,追加jsessionId至url的重新逻辑可以被禁用,通过设置disable-url-rewriting=”true” 。另外自servlet3.0开始,session跟踪机制也可以在web.xml中配置:

    <session-config>
    <tracking-mode>COOKIE</tracking-mode>
    </session-config>

    javaConfig方式配置如下:

    servletContext.setSessionTrackingModes(EnumSet.of(SessionTrackingMode.COOKIE));

    配置可以设置jessionId存储位置:cookie或url参数。

    spring security防止篡改session
    框架提供了保护典型的session篡改攻击,当用户尝试再次认证时,已经存在的session可以配置实现以不同方式处理。配置方式如下:

    http.sessionManagement()
    .sessionFixation().migrateSession()

    缺省情况,spring security启用migrateSession,即认证时,创建一个新http session,原session失效,属性从原session中拷贝过来。

    如果不期望这种行为,还有其他两个选项:

    “none”,原session保持有效;
    “newSession”,新创建session,且不从原session中拷贝任何属性。
    使用session
    session范围bean
    bean可以简单地通过@Scope在web上下文中定义session范围:

    @Component
    @Scope("session")
    public class Foo { .. }

    然后,可以再注入值另一个bean:

    @Autowired
    private Foo theFoo;

    这时,spring会在http session范围内创建一个新的bean。

    在Controller中注入原生session
    原生的session可以被直接注入至Controller方法:

    @RequestMapping(..)
    public void fooMethod(HttpSession session) {
    session.addAttribute(Constants.FOO, new Foo();
    //...
    Foo foo = (Foo) session.getAttribute(Constants.Foo);
    }


    获取原生session
    也可以通过调用servlet api以编程方式获取当前http session:

    ServletRequestAttributes attr = (ServletRequestAttributes)
    RequestContextHolder.currentRequestAttributes();
    HttpSession session= attr.getRequest().getSession(true); // true == allow create

    总结
    本文讨论了spring security如何管理session,以及如何使用session。
    ————————————————
    版权声明:本文为CSDN博主「neweastsun」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/neweastsun/article/details/79371175

  • 相关阅读:
    Panda 交易所带我们一起来聊聊2021年区块链未来趋势
    Panda 交易所视点“区块链+政务”深度融合开启智慧城市政务新时代
    Panda 交易所热点关注,区块链数字溯源系统平台研发搭建
    熊猫交易所视点,2021年“区块链+”前景如何?
    Adroid Studio 消息推送
    .net core 设计模式--->代理模式
    .net core 邮件发送封装并生成dll文件
    U3D PC端桌面应用程序远程升级
    .net core 带附件邮件发送
    Copula函数
  • 原文地址:https://www.cnblogs.com/renjiaqi/p/11634606.html
Copyright © 2011-2022 走看看