如何使用Spring Security控制会话

news2024/10/6 22:25:01

在 Spring 安全教程的这篇文章中,我们将讨论Spring 安全会话管理。我们将讨论 Spring 安全性的独特功能,这有助于我们高效和安全的会话管理。

春季安全会议

本文将讨论安全会话管理以及 spring 安全性如何帮助我们控制 HTTP 会话。Spring 安全性使用以下选项来控制 HTTP 会话功能

  1. SessionManagementFilter.
  2. SessionAuthneticationStrategy

这 2 个有助于 Spring 安全管理安全会话中的以下选项:

  1. 会话超时检测和处理。
  2. 并发会话(经过身份验证的用户可以同时打开的会话数)。
  3. 会话固定 – 处理会话

让我们详细了解这些选项

1. 何时创建会话

Spring 安全性提供了不同的选项来控制会话创建。它为我们提供了配置何时创建会话以及如何与会话交互的选项。以下是安全性中可用的选项,可以帮助我们配置和控制会话创建。

  1. SessionCreationPolicy.ALWAYS– 会话将始终创建(如果它不存在)。
  2. SessionCreationPolicy.NEVERSpring Security永远不会创建HttpSession,但如果它已经存在,则会使用它(可通过应用程序服务器获得)HttpSession
  3. SessionCreationPolicy.IF_REQUIREDSpring Security 只会在需要时创建 HttpSession (默认配置。如果您不指定,Spring 安全性将使用此选项)
  4. SessionCreationPolicy.STATELESSSpring Security永远不会创建一个HttpSession,它永远不会使用它来获取。SecurityContext

对于基于登录,应用程序适用于大多数情况,也是 Spring 安全性中的默认设置。对于典型的 Web 应用程序。要更改 Spring 安全性中的会话创建策略,我们可以通过覆盖 配置方法。SessionCreationPolicy. IF_REQUIREDWebSecurityConfigurerAdapter

@EnableWebSecurity
public class AppSecurityConfig extends WebSecurityConfigurerAdapter {

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

让我们记住以下要点

  1. 这些配置仅控制 Spring 安全行为,而不控制您的应用程序。您的应用程序可能使用不同的会话创建配置。
  2. 默认情况下,Spring 安全性将在需要时创建会话。它可以在 Spring 安全上下文之外使用应用程序创建的会话。(请记住,会话是由应用程序服务器创建的)。
  3. 这将确保 Spring 安全性不会创建任何会话,但这并不意味着您的应用程序不会创建任何会话。此策略仅适用于 Spring 安全上下文。您可能仍然会在您的应用程序中看到,所以不要认为 Spring 安全配置不起作用。STATELESSJSESIONID

请记住,Spring 安全性在 HTTP 会话的帮助下处理登录和注销请求。Spring安全不会使用cookie,每个请求都需要重新身份验证。我将在不同的帖子中介绍它,但另一个选项是使用 Spring 会话来集中管理您的Spring 会话。SessionCreationPolicy. STATELESS

1.1. Spring 安全性和 HTTP 会话

弹簧安全在很大程度上依赖于我们清楚地了解弹簧安全如何在内部使用该方法,这一点非常重要。下面是该过程的高级概述。HTTPSessionHTTPSession

  1. Spring 安全性使用 theand来存储经过身份验证的对象。经过身份验证的对象包含有关登录用户的信息。SecurityContextSecurityContextHolder
  2. 检索请求使用(检查源代码 SecurityContextPersistenceFilter)。Spring 安全性默认使用哪个使用来获取 HTTPSession。SecurityContextPersistenceFilterSecurityContextSecurityContextRepositoryHttpSessionSecurityContextRepositoryHTTPRequest
  3. 它将安全上下文存储在。SecurityContextHolder
  4. 这在整个请求生命周期中都可用。SecurityContext
  5. 在请求周期结束时,将清除(检查最终块中的SecurityContextPersistenceFilterSecurityContextHolderSecurityContextPersistenceFilter)

2. 春季安全会话超时

会话超时后,如果他们提交具有无效会话 ID 的请求,我们可以将使用重定向到特定页面。要配置重定向 URL,我们可以通过覆盖来使用该方法。configureWebSecurityConfigurerAdapter

@EnableWebSecurity
public class AppSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
            .invalidSessionUrl("/login");
    }
}

如果你在配置中工作,你可以使用element来做到这一点:XMLsession-manegement

<http>
...
<session-management invalid-session-url="/login" />
</http>

当您将 Spring 启动应用程序部署到独立服务器时,配置会话超时的方式与在任何其他战争部署中相同。

在 Tomcat 的情况下,我们可以通过在管理器元素上配置属性或使用 web.xml 中的元素来设置会话超时。请注意,第一个选项将影响部署到 Tomcat 实例的每个应用。maxInactiveIntervalserver.xmlsession-timeout

2.1. 使用 Spring 引导配置会话超时

Spring Boot 带有许多默认值,并且使用该文件可以更轻松地配置和自定义行为。若要控制会话超时,请使用以下属性application.properties

server.servlet.session.timeout= 120s

使用它时,请记住以下重要因素

  1. 如果您没有指定时间单位(在我们的例子中为 s),Spring boot 将假定第二个作为默认单位。
  2. 如果您使用的是 tomcat,它仅支持分钟精度,例如 187 将被视为 3 分钟。

3. Spring 安全并发会话控制

在某些应用程序(主要是金融应用程序)中,我们希望限制同一用户的多次登录。如果您想根据用户数量销售服务,并且希望仅允许基于许可证的指定用户(例如以用户帐户数量为基础出售的云服务),这也很有用。当用户通过身份验证并尝试再次重新进行身份验证时,我们的应用程序可以通过以下方式之一进行响应:

  1. 使现有会话失效并创建新的经过身份验证的会话。
  2. 继续退出会话并为新的登录尝试抛出/显示错误消息。
  3. 允许两个会话都存在,并允许用户从不同位置登录。

Spring 安全性支持通过会话管理限制同一用户的多次登录的功能。启用此功能的第一步是在应用程序中添加侦听器。在 Spring 引导应用程序中添加侦听器是一种 Bean 配置。侦听器将保持有关会话生命周期事件的春季安全性更新。HttpSessionEventPublisherHttpSessionEventPublisher

/**
 * We need this bean for the session management. Specially if we want to control the concurrent session-control support
 * with Spring security.
 * @return
 */
@Bean
public HttpSessionEventPublisher httpSessionEventPublisher() {
    return new HttpSessionEventPublisher();
}

如果使用 xml 配置,请使用文件添加会话控制支持:web.xml

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

3.1. 了解 Spring 安全并发会话控制

Spring 安全性并发会话控制是一项强大的功能,但在实施之前请确保您正确理解它。错误的理解可能会导致很多混乱,您可能会认为它没有按预期工作。Spring 安全部门在内部使用的重要类很少来强制执行此功能。以下是一些关键组件。

  1. SessionRegistry.
  2. ConcurrentSessionControlStrategy
  3. HttpSessionEventPublisher.
  4. SessionManagementFilter
  5. ConcurrentSessionFilter

并发会话控制功能用于维护活动会话列表以及关联的经过身份验证的用户的信息。每次创建或销毁会话时,它都会通过 Spring 安全性实时更新此会话注册表。我们在本文前面配置了 Spring 安全性使用此事件发布来发布会话生命周期中的事件,并且相应地更新了 SessionRegistry。SessionRegistryHTTPHttpSessionEventPublisher

ConcurrentSessionControlStrategy负责遍历新会话并强制实施并发会话策略。每次登录的客户尝试访问应用程序的安全部分时,都会检查用户的活动会话。过滤器将识别过期的会话,并通知用户其会话已过期。为了更好地理解,您还可以检查这些类的源代码。下面是一个高级工作流,概述了 Spring 安全并发会话控制的工作原理:SessionManagementFilterSessionRegistryConcurrentSessionFilter

让我们看看并发会话功能的实际应用。

3.2. 通过 Spring 安全性限制每个用户的并发会话数

通过监听器配置,我们可以控制应用程序的会话多个会话功能。让我们举一个示例,我们希望每个客户最多允许 1 个会话。如果最大会话数超过 1,它将使 Spring 安全性的第一个会话无效。如何使用 Spring 安全配置完成此操作:HttpSessionEventPublisher

@EnableWebSecurity
public class AppSecurityConfig extends WebSecurityConfigurerAdapter {

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

您可以从我们的GitHub 存储库下载该应用程序。应用程序启动后,执行以下步骤进行测试。

  1. 在 Firefox 中打开登录页面并使用有效的用户名和密码登录(请确保在此步骤之前创建了一个帐户。
  2. 打开 chrome 或任何其他浏览器(Firefox 除外)并使用相同的用户名和密码登录(在步骤 1 中使用)。
  3. 返回chrome浏览器并刷新或单击任何链接,您将在应用程序中看到类似的消息

这是来自弹簧安全的默认消息。Spring 安全性提供了配置URL的灵活性,当用户尝试进行额外登录时将调用该URL。要配置过期的会话重定向,我们可以使用该方法。expiredUrl

@EnableWebSecurity
public class AppSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.sessionManagement()
            .maximumSessions(1)
            .expiredUrl("/login?invalid-session=true");
    }
}

您可以在登录页控件中添加一些自定义错误消息。重新运行应用程序并按照上述步骤测试应用程序,在这种情况下,您将看到自定义错误消息,而不是 Spring 标准错误消息。

3.3. 禁用身份验证

对于默认配置(如第 3.1 节和第 3.2 节所述),第二次登录将导致第一次登录无效。这有时会引起混乱。想象一下,您正在工作,突然看到此消息是您意外在另一个浏览器中执行的登录。为了处理这些用例,Spring 安全性提供了一个选项,我们可以在其中向第二次尝试显示错误消息,而不是强制原始用户注销。我们可以在的帮助下启用此功能。maxSessionsPreventsLogin

@EnableWebSecurity
public class AppSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.sessionManagement()
            .maxSessionsPreventsLogin(true)
            .maximumSessions(1)
            .expiredUrl("/login?invalid-session=true");
    }
}

将值设置为 for。在尝试使用此方法时必须小心。truemaxSessionsPreventsLogin

  1. 如果用户关闭窗口而不点击注销按钮,则在会话超时之前,他们将无法再次登录。
  2. 发生这种情况是因为它会在关闭浏览器窗口时删除 JSESSIONID,但是您仍然是底层应用程序的登录用户。

有关更多信息,请阅读Spring 安全文档。

3.4. 并发控制 – 常见问题

有了方法,请记住几个要点,因为如果您不清楚一些细节,它可能会导致很多混乱和问题maximumSessions

  1. 如果您使用的是自定义实例,请确保覆盖和方法。UserDetailsequals()hashCode()
  2. 默认情况下,Spring 安全实现使用 anto 存储。如果您使用的是没有 and 方法的自定义用户详细信息,它将无法正确匹配用户。此外,来自 Spring 安全性的默认对象为两者和方法提供了实现。SessionRegistryin-memory mapUserDetailsequals()hashCode()UserDetailsequals()hashCode()
  3. 如果使用 Spring 安全性记住我功能进行登录,则不会强制执行并发控制
  4. 在群集环境中,默认并发控制将不作为内存中实现工作。用户登录将特定于服务器,如果同一用户尝试登录到群集上的其他服务器上,则可以再次登录。您可以使用春季会话在自定义的帮助下处理此问题SessionRegistrySessionRegistry
  5. 如果应用程序服务器重新启动,则该将为空(记住它是一个),但已经使用有效会话登录的用户将登录。这将在用户登录时产生冲突,但 Spring 安全性会将用户标记为未登录。我们也可以在 custom 的帮助下解决此问题以从中心位置加载数据。SessionRegistryin-memory mapSessionRegistry

总结

在本文中,我们讨论了 Spring 安全会话管理以及如何使用 Spring 安全性控制会话。总而言之,我们在本文中讨论了以下要点。

  1. Spring 安全性如何管理会话以及如何使用 Spring 安全性控制会话创建策略。
  2. 如何并发控制与 Spring 安全性一起工作。
  3. 如何配置每个用户的并发会话数。
  4. Spring 安全并发控制的限制以及用于自定义它的选项很少。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/14024.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1.4_29 Axure RP 9 for mac 高保真原型图 - 案例28【中继器-后台管理系统6】功能-原位修改数据

相关链接 目录Axure中文学习网AxureShopAxureShop-QA 案例目标1. 了解使用中继器&#xff0c;弹窗修改数据的实现方式 一、成品效果 Axure Cloud 案例28【中继器 - 后台管理系统6】功能-原位修改数据 版本更新一、修改功能   1.1 文本框&#xff1a;点击数据位置&#xff…

InternImage

终于有对抗Transformer 的了~~ 来自浦江实验室、清华等机构的研究人员提出了一种新的基于卷积的基础模型&#xff0c;称为 InternImage&#xff0c;与基于 Transformer 的网络不同&#xff0c;InternImage 以可变形卷积作为核心算子&#xff0c;使模型不仅具有检测和分割等下游…

MySQL删除表数据总结(DELETE、TRUNCATE、DROP)

&#xff08;1&#xff09;当我们不再需要该表时&#xff0c;使用DROP&#xff0c;会连表一起删掉&#xff0c;无法找回。速度很快。 DROP TABLE web_tbl_search;&#xff08;2&#xff09;保留表结构&#xff0c;只删除表数据&#xff0c;使用TRUNCATE&#xff0c;数据删除后…

【unCloud】在使用uni-admin时遇到的问题(原uniCloud-admin)

目录一、前言二、遇到的几个小问题问题一&#xff1a;可登录应用解决方法、步骤一、前言 这是我跟着官方的教学视频学习时遇到的一切小问题&#xff0c;由于我是初学&#xff0c;也没什么很多Vue一类的基础&#xff0c;所以学起来可能才会觉得这些是问题&#xff0c;但是也暂做…

得物视频编辑工具优化全指南

一、背景介绍 随着5G网络的推广和网络带宽的提升&#xff0c;视频成为互联网用户主要的消费载体&#xff0c;用户通过短视频来分享和浏览信息。由此视频的编辑功能越来越重要、越来越普遍。视频编辑的APP也如雨后春笋般涌现。 更好地推动得物App社区业务的发展&#xff0c;得…

测试日常工作中需要具备哪些知识和能力,在需求评审时需要考虑哪些方面,在技术方面评审时需要考虑哪些方面,从什么方面进行设计测试用例

前几天同事分享了一波作为测试需要具备哪些能力&#xff0c;测试用例需要从哪些方面进行设计&#xff0c;我把他分享的内容拷贝了一波&#xff0c;作为以后在测试过程中的参考。 首先需求评审、技术方案评审、测试用例评审三者的关系 一开始&#xff0c;我每次设计测试用例都是…

操作系统 | 实验八 文件管理

一、实验目的 掌握文件的存取方法&#xff1b;掌握文件的逻辑结构和物理结构&#xff1b;掌握存储空间的分配和回收&#xff1b;掌握磁盘管理与调度。 二、实验内容 用程序模拟磁盘的调度过程&#xff0c;并计算各磁盘调度算法包括先来先服务算法、最短寻道时间优先算法、扫…

【大根堆 Java】使用优先队列+HashMap 解决前 K 个高频元素问题

一、题目描述 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 二、思路 本题我们主要完成两个步骤&#xff1a; 统计出每个元素出现的次数找出出现次数最多的前 K 个元素 对第一个步骤&#xf…

IPWorks S/MIME Delphi Edition

IPWorks S/MIME是一套用于电子邮件加密和文档安全的综合组件。IPWorks S/MIME使用公钥密码标准&#xff08;PKCS&#xff09;实现加密和解密的S/MIME标准。 IPWorks S/MIME包括通用的S/MIME组件以及支持S/MIME的IPWorks POP3、IMAP、SMTP、FileMailer和HTMLMailer组件版本。还…

【MMDet】提交PR的学习笔记

官方文档 关于如何向MMDet提交PR&#xff0c;请参考mmcv的文档《拉取请求 — mmcv 1.6.1 文档》 1. Fork最新代码库 当第一次提PR时&#xff0c;需要复刻OpenMMLab代码库&#xff0c;点击 GitHub 页面右上角的Fork按钮即可 将复刻的代码库克隆到本地 git clone fork_mmdet…

trunc函数与truncate函数的一点区别

Oracle的trunc函数与truncate函数都可以对数值进行截取操作 -- 首先看对数值进行截取操作 SELECT TRUNCATE(122.123, 4) from dual; # 122.123 SELECT TRUNCATE(122.123, 3) from dual; # 122.123 SELECT TRUNCATE(122.123, 2) from dual; # 122.12 SELECT TRUNCATE(122.123, 1…

vue3中使用element plus

1、先安装node.js node.js的安装_西瓜君的代码的博客-CSDN博客 2、安装vue-cli vue-cli的安装_西瓜君的代码的博客-CSDN博客 3、安装element-plus Element UI 安装_西瓜君的代码的博客-CSDN博客 4、idea中使用vue3 在idea中使用vue3_西瓜君的代码的博客-CSDN博客 5、 加入 impo…

分享从零开始学习网络设备配置--2.5 提高骨干链路带宽(链路聚合)

任务描述 某公司的网络中心为了接入网络稳定性&#xff0c;在汇聚层交换机的连接连路上使用了多条冗余链路&#xff0c;同时&#xff0c;为了增加带宽&#xff0c;多条冗余链路之间实现端口聚合&#xff0c;提高骨干链路的带宽&#xff0c;这样可以实现链路之间的冗余和备份效果…

Node.js v19,它来了。详解 6 大特性

通译自&#xff1a;6 Major Features of Node.js 19. Details of Node.js 19 new features… | by Jennifer Fu | Oct, 2022 | Better Programming Node 19 在 2022-10-18 发布。 我们知道 Node.js 版本分两种&#xff1a;LTS 和 Current 其中&#xff0c;Current 版本通常每 …

C语言第十课(下):优化井字棋游戏

目录 前言&#xff1a; 一、优手着棋判定&#xff1a; 1.防守型着棋优化&#xff1a; 2.进攻型着棋优化&#xff1a; 二、界面格式优化&#xff1a; 1.Sleep休眠语句&#xff1a; 2.system语句&#xff1a; 三、优化后最终全部代码&#xff1a; 1.头文件game.h: 2.函数功能…

MFIF:Deep Regression Pair Learning

DRPL: Deep Regression Pair Learning for Multi-Focus Image Fusion 本文提出了一种用于多焦点图像融合的新型深度网络&#xff0c;称为深度回归对学习 (DRPL)。与现有的深度融合方法将输入图像分割成小的补丁并应用分类器来判断补丁是否聚焦相比&#xff0c;DRPL直接将整个图…

java springboot获取GitLab上的文件内容

这里以最简单的方式获取git上的文件,并读取文件 第一步:获取主域名host 进入网页版的git,链接为:https://gitlab.***.com 第二步:获取access_token 在git网页端登录后的右上角用户头像下拉菜单的settings页面===>再点击settings页面的左侧菜单栏中的Access Tokens选…

Shell 脚本编程(二) —— 条件判断 (test命令) + 多路分支语句(if 、case)

test 命令可以用于判断文件类型以及值的比较&#xff0c;test 判断条件为真&#xff0c;返回 0&#xff1b;条件为假&#xff0c;返回 1。 目录 一、条件判断 (1) 整数判断 (2) 字符串判断 (3) 文件判断 二、if 语句 1、语法结构 2、实际运用 三、case语句 一、条件判断…

【毕业设计】图像识别跌倒检测算法研究与实现 - python 深度学习 机器学习

文章目录0 前言1 简介2 实现方法2.1 传统机器视觉算法2.2 基于机器学习的跌倒检测2.2.1 SVM简介2.2.2 SVM跌倒检测原理2.2.3 算法流程2.2.4 算法效果2.3 深度学习跌倒检测2.3.1 最终效果2.3.2 网络原理3 最后0 前言 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是丹成…

Java集合框架【二容器(Collection)[ArrayList]】

文章目录1 容器/集合简介2 容器的结构2.1 结构图2.1.1 单例集合2.1.2 双例集合3 单例集合的使用3.1 Collection接口的介绍3.2 Collection接口中的接口方法3.3 List接口3.3.1 List接口特点3.3.2List的常用方法3.4 ArrayList容器类3.4.1 添加元素3.4.2 获取元素3.4.3 根据索引删除…