热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

使用SpringSecurity控制会话的方法

在本文中,我们将说明SpringSecurity如何允许我们控制HTTP会话。这篇文章主要介绍了使用SpringSecurity控制会话,需要的朋友可以参考下

1.概述

在本文中,我们将说明Spring Security如何允许我们控制HTTP会话。此控件的范围从会话超时到启用并发会话和其他高级安全配置。

2.会话何时创建?

我们可以准确控制会话何时创建以及Spring Security如何与之交互:

•always - 如果一个会话尚不存在,将始终创建一个会话
•ifRequired - 仅在需要时创建会话(默认)
•never - 框架永远不会创建会话本身,但如果它已经存在,它将使用一个
•stateless - Spring Security不会创建或使用任何会话

...

Java配置:

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

了解此配置仅控制Spring Security的功能非常重要 - 而不是整个应用程序。如果我们不指示Spring Security,可能无法创建会话,但我们的应用程序可能会!

默认情况下,Spring Security会在需要时创建会话 - 这是“ifRequired”。

对于更无状态的应用程序,“never”选项将确保Spring Security本身不会创建任何会话;但是,如果应用程序创建了一个,那么Spring Security将使用它。

最后,最严格的会话创建选项 - “stateless” - 保证应用程序根本不会创建任何会话。

这是在Spring 3.1中引入的,它将有效地跳过部分Spring Security过滤器链。主要是会话相关的部分,如

HttpSessionSecurityContextRepository,SessionManagementFilter,RequestCacheFilter。

这些更严格的控制机制直接暗示不使用COOKIE,所以每个请求都需要重新进行身份验证。这种无状态架构适用于REST API及其无状态约束。它们也适用于基本和摘要式身份验证等身份验证机制。

3. Under The Hood

在执行身份验证过程之前,Spring Security将运行一个负责在请求之间存储安全上下文的过滤器-SecurityContextPersistenceFilter。上下文将根据策略存储 - 默认情况下为HttpSessionSecurityContextRepository - 它使用HTTP会话作为存储。对于strict create-session =“stateless”属性,此策略将替换为另一个 - NullSecurityContextRepository - 并且不会创建或使用会话来保留上下文。

4.并发会话控制

当已经过身份验证的用户尝试再次进行身份验证时,应用程序可以通过以下几种方式之一处理该事件。它可以使用户的活动会话无效,并使用新会话再次对用户进行身份验证,或者允许两个会话同时存在。

启用并发会话控制支持的第一步是在web.xml中添加以下侦听器:


  
   org.springframework.security.web.session.HttpSessionEventPublisher
  

或者将其定义为Bean - 如下所示:

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

这对于确保在销毁会话时通知Spring Security会话注册表是至关重要。

要为同一用户启用允许多个并发会话的方案,应在XML配置中使用元素:


  
    
  

或者,通过Java配置:

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

5.会话超时

会话超时后,如果用户发送的会话ID已过期,则会将其重定向到可通过命名空间配置的URL:


  

同样,如果用户发送的会话ID未过期但完全无效,则它们也会被重定向到可配置的URL:


  ...

相应的Java配置:

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

6.防止使用URL参数进行会话跟踪

在URL中公开会话信息的安全风险越来越大(从2007年的第7位到2013年在OWASP排行榜前10位的第2位)。

从Spring 3.0开始,现在可以通过在命名空间中设置disable-url-rewriting =“true”来禁用将jsessionid附加到URL的URL重写逻辑。

或者,从Servlet 3.0开始,也可以在web.xml中配置会话跟踪机制:


   COOKIE

编程方式

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

这将选择存储JSESSIONID的位置 - 在COOKIE或URL参数中。

7. Spring Security的会话固定保护

该框架通过配置在用户已有会话的情况但尝试再次进行身份验证时,提供了针对典型会话固定攻击的保护:

...

相应的Java配置:

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

默认情况下,Spring Security启用了此保护(“migrateSession”) - 在身份验证时,会创建一个新的HTTP会话,旧的会话将失效,旧会话的属性将被复制。

如果这不是所需的行为,则可以使用其他两个选项:

•设置“none”时,原始会话不会失效
•设置“newSession”时,将创建一个干净的会话,而不会复制旧会话中的任何属性

8.安全会话COOKIE

接下来,我们将讨论如何保护会话COOKIE。

我们可以使用httpOnly和secure标签来保护我们的会话COOKIE:

•httpOnly:如果为true,那么浏览器脚本将无法访问COOKIE
•secure:如果为true,则COOKIE将仅通过HTTPS连接发送

我们可以在web.xml中为会话COOKIE设置这些标志:


  1
  
    true
    true
  

从Java servlet 3开始,此配置选项可用。默认情况下,http-only为true且secure为false。

我们来看看相应的Java配置:

public class MainWebAppInitializer implements WebApplicationInitializer {
  @Override
  public void onStartup(ServletContext sc) throws ServletException {
    // ...
    sc.getSessionCOOKIEConfig().setHttpOnly(true);    
    sc.getSessionCOOKIEConfig().setSecure(true);    
  }
}

如果我们使用Spring Boot,我们可以在application.properties中设置这些标志:

server.servlet.session.COOKIE.http-Only=true
server.servlet.session.COOKIE.secure=true

最后,我们还可以使用Filter手动实现此目的:

public class SessionFilter implements Filter {
  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
   throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;
    COOKIE[] allCOOKIEs = req.getCOOKIEs();
    if (allCOOKIEs != null) {
      COOKIE session = 
       Arrays.stream(allCOOKIEs).filter(x -> x.getName().equals("JSESSIONID"))
          .findFirst().orElse(null);
 
      if (session != null) {
        session.setHttpOnly(true);
        session.setSecure(true);
        res.addCOOKIE(session);
      }
    }
    chain.doFilter(req, res);
  }
}

9.Session使用

9.1。 Session Scoped Beans

只需在web-Context中,使用@Scope注释声明的bean:

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

或者使用XML:

然后,bean可以简单地注入另一个bean:

@Autowired
private Foo theFoo;

Spring会将新bean绑定到HTTP Session的生命周期。

9.2。将会话注入控制器

原始HTTP会话也可以直接注入Controller方法:

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

9.3。获取会话

当前的HTTP Session也可以通过原始Servlet API以编程方式获得:

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

10.总结

在本文中,我们讨论了使用Spring Security管理Sessions。此外,Spring Reference包含一个非常好的会话管理常见问题解答。

与往常一样,本文中提供的代码可以在Github上获得。这是一个基于Maven的项目,因此它应该很容易导入和运行。

以上所述是小编给大家介绍的使用Spring Security控制会话的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!


推荐阅读
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
author-avatar
U友50096631
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有