Spring Security实战(四)—— 会话管理

news2024/11/19 2:37:51

目录

一、理解会话

二、防御会话固定攻击

 三、会话过期

四、会话并发控制

五、集群会话的缺陷

六、集群会话的解决方案

七、整合Spring Session解决集群会话问题


         只需在两个浏览器中用同一个账号登录就会发现,系统并没有任何会话并发限制。一个账号可以多处同时登陆并不是一个好的策略。Spring Security已经为我们提供了完善的会话管理功能,包括会话固定攻击、会话超时检测以及会话并发控制。

一、理解会话

        会话(session)就是无状态的HTTP实现用户状态可维持的一种解决方案。HTTP本身的无状态使得用户在与服务器的交互过程中,每个请求之间都没有关联性。这就意味着用户的访问没有身份记录,站点也无法为用户提供个性化的服务。session的诞生解决了这个难题。

        服务器通过与用户约定每个请求都携带一个id类的信息,从而让不同的请求之间有了关联。当用户首次访问系统时,系统会为该用户生成一个sessionId,并添加到cookie中。在该用户的会话期内,每个请求都自动携带该cookie,因此系统可以很轻易识别出是来自哪个用户的请求。

会话固定攻击:

        黑客只需访问一次系统,将系统生成的sessionId提取并拼凑在URL上,然后将该URL发给一些取得信任的用户。只要用户在session有效期内通过此URL进行登录,该sessionId就会绑定用户的身份,黑客便可以轻松享有同样的会话状态,完全不需要用户名和密码。这就是会话固定攻击。

二、防御会话固定攻击

         防御会话固定攻击的方法非常简单,只需在用户登录之前重新生成新的session即可,在继承WebSecurityConfigureAdapter 时,Spring Security 已经启用了该配置。

        sessionManagement是一个会话管理的配置器,其中,防御会话固定攻击的策略有四种:

  • none:不做任何变动,登录之后沿用旧的session
  • newSession:登录之后创建一个新的session
  • migrateSession:登录之后创建一个新的session,并将旧的session中的数据复制过来
  • changeSessionId:不创建新的会话,而是使用由Servlet容器提供的会话固定保护

默认启用的是migrateSession策略,可以自己根据需要修改,如:

 

 三、会话过期

        除防御会话固定攻击外,还可以通过Spring Security配置一些会话过期策略,例如过期时跳转到某个URL:

 也可以完全自定义过期策略:

public class MyInvalidSessionStrategy implements InvalidSessionStrategy {
    @Override
    public void onInvalidSessionDetected(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        response.setContentType("application/json;charset=utf-8");
        response.getWriter().write("session无效,已过期!");
    }
}

四、会话并发控制

        设置单个用户允许同时在线的最大会话数,如果没有额外的配置,新登录的会话会踢掉旧的会话。

 查看效果:

 

在另一个浏览器登录之后,之前的浏览器会提示出这条信息。改成 maximumSession(2) 时候,两个浏览器可以同时登录。

五、集群会话的缺陷

        大多数集群部署会采用类似下图的网络结构:

        在这种网络结构下,用户的请求首先会到LB(负载均衡)服务器上,LB服务器再根据负载均衡策略将这些请求转发至后面的服务,以达到请求分散的目的。正常情况下,在集群中,同个用户的请求可能会分发到不同的服务器上,加入登录操作是在Server1上完成的,Server1缓存了用户的登录状态,但Server2和Server0并不知情,如果用户的后续操作被分配到了Server2或Server0上,这时就会要求该用户重新登录,这就是典型的会话状态集群不同步问题。

六、集群会话的解决方案

        集群会话的常见方案有三种:

  • session保持——将相同客户的请求转发至相同的而服务器上
  • session复制——集群服务器之间同步session数据
  • session共享——将session存储到独立的服务器,进行共享,在内网环境下,高可用部署的Redis服务器是最优选择。Redis基于内存的特性让它拥有极高的读写性能,高可用部署不仅降低了网络I/O损耗,还提高了稳定性。

七、整合Spring Session解决集群会话问题

(1)添加依赖

        <!--spring session核心依赖-->
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-core</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
            <version>2.4.2</version>
        </dependency>

        <!--springboot 整合redis核心依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <!-- 使用Jedis -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.6.0</version>
        </dependency>

 (2)配置Spring Session

为Spring Security提供集群支持的会话注册表

@Configuration
@EnableRedisHttpSession
public class HttpSessionConfig {
  
    // 提供redis连接,localhost:6379
    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new JedisConnectionFactory();
    }
  
    @Bean
    public SpringSessionBackedSessionRegistry springSessionBackedSessionRegistry(
            FindByIndexNameSessionRepository sessionRepository) {
        return new SpringSessionBackedSessionRegistry(sessionRepository);
    }
  
    @Bean
    public HttpSessionEventPublisher httpSessionEventPublisher() {
        return new HttpSessionEventPublisher();
    }
}

    

在该类中,使用了@Autowired注解将RedisConnectionFactory对象注入进来。RedisConnectionFactory对象用于创建一个RedisTemplate对象,用于操作Redis存储session的数据。

@Bean注解被用于定义了三个Bean:

  1. sessionRedisOperations方法返回一个RedisTemplate对象,用于操作Redis存储session的数据。

  2. sessionRepository方法返回一个FindByIndexNameSessionRepository对象,这是Spring Session提供的一个实现类,用于管理HttpSession。

  3. sessionRepository方法还返回了一个MapSessionRepository对象,这个对象用于在没有Redis环境的情况下,将Session存储在内存中。

在这个类中,配置了Redis存储session和使用内存存储session的两种实现,可以根据需要选择相应的实现。

需要注意的是,如果想使用Redis存储session,就必须保证已经正确配置了Redis环境,包括Redis服务器的地址和端口等信息。

(3)将新的会话注册表提供给Spring Security

 (4)在不同的端口上启动服务测试

默认的服务是启动在8080端口的,这里我们在8081端口上再启动一个:

 两个端口都启动后,先访问8080端口,再访问8081端口:

 这时候再刷新8080端口的页面,可以看到已经被8081上的用户给挤掉了:

 在redis中也可以看到存储的session信息:

 

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

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

相关文章

cuSPARSE官方程序示例

cuSPARSE Library 简介 这个文件演示了cuSPARSE通用API的用法 官方程序&#xff1a;后续会出解析&#xff08;20230410&#xff09; cuSPARSE Generic APIs Documentation cuSPARSE Samples 向量 - 向量 操作矩阵 - 向量 操作矩阵 - 矩阵操作转换Legacy APIs优化稀疏迭代…

阿里本地生活再出发:口碑入高德,备战美团、抖音

配图来自Canva可画 近日&#xff0c;有传言称高德地图将和阿里本地生活旗下的到店业务口碑正式合并&#xff0c;未来阿里旗下所有的本地生活到店业务都将统一整合在高德地图的入口中。3月22日&#xff0c;高德地图正式确认了此事&#xff0c;并表示高德地图作为“出门好生活开…

网络软件-管理网络设备和组件

网络软件是一个术语&#xff0c;表示帮助网络管理员轻松执行特定操作的任何网络软件。术语“网络软件”可以包括广泛的软件解决方案&#xff0c;每个解决方案都提供特定的功能&#xff0c;共同帮助网络管理员完全控制其IT基础架构。网络软件工具提供监控网络运行状况、测量性能…

一个简单的MUX-VLAN实验(华为eNSP模拟器)

MUX-VLAN产生背景及用途 在数据中心网络中&#xff0c;数据中心管理员希望数据中心内部所有服务器&#xff08;或终端&#xff09;都可以访问外部网络&#xff0c;同时部分服务器之间可以互相通信&#xff0c;部分服务器之间相互隔离。一般情况下&#xff0c;为了实现所有服…

python贪吃蛇代码

文末用python写好了贪吃蛇代码可直接复制使用&#xff01; 今天和大家分享一下贪吃蛇的代码&#xff0c;主要是贪吃蛇的一些基本知识&#xff0c;以及怎么去玩。 首先&#xff0c;我们先了解一下什么是贪吃蛇&#xff1f;它是一个具有多种功能的游戏&#xff0c;可以通过点击屏…

绿联dx4600砖机救援

由于在操作ssh过程不当&#xff0c;导致成为搬砖&#xff0c;记录一下救援过程 涉及到拆机&#xff0c;会导致损保&#xff0c;建议邮寄官方救援 变砖前因&#xff1a; 发现可以使用opkg&#xff0c;遂用opkg进行安装包的操作&#xff0c;最后更新busy-box&#xff0c;而进行b…

Vue源码解析(尚硅谷)

视频地址&#xff1a;Vue源码解析系列课程 一、Vue源码解析之mustache模板引擎 1. 什么是模板引擎 模板引擎是将数据要变为视图最优雅的解决方案 历史上曾经出现的数据变为视图的方法 2. mustache基本使用 mustache库简介 mustache库基本使用 3. mustache的底层核心机理…

3.7.2数据库系统-数据库控制技术:数据库的安全性、数据库备份与恢复技术、数据备份、数据库故障与恢复、数据库性能优化

3.7.2数据库系统-数据库控制技术&#xff1a;数据库的安全性、数据库备份与恢复技术、数据备份、数据库故障与恢复、数据库性能优化数据库的安全性数据库备份与恢复技术数据备份数据库故障与恢复数据库性能优化数据库的安全性 在做信息系统开发的过程当中&#xff0c;数据库是…

集合的线程安全解读

目录 集合操作 Demo Vector Collections CopyOnWriteArrayList(重点) “动态数组”机制 “线程安全”机制 集合操作 Demo NotSafeDemo public class NotSafeDemo {/*** 多个线程同时对集合进行修改* param args*/public static void main(String[] args) {List list ne…

100Wqps异地多活,得物是怎么架构的?

说在前面 在40岁老架构师尼恩的数千读者群中&#xff0c;一直在指导大家简历和职业升级&#xff0c;前几天&#xff0c;指导了一个华为老伙伴的简历&#xff0c;小伙伴的优势在异地多活&#xff0c;但是在简历指导的过程中&#xff0c;尼恩发现&#xff1a; 异地多活的概念、异…

大专毕业该怎么办?

大专学历转IT拿10k&#xff01;谁说生活不能是热血漫&#xff1f; “本科生讨论孔乙己的长衫&#xff0c;我们专科生怎么办&#xff1f;” “专科生的唯一出路难道就是进厂吗&#xff1f;” 在如今的就业内卷浪潮中&#xff0c;专科生的处境是最为尴尬的。一方面&#xff0c;很…

黑马在线教育数仓实战5

5. 意向用户主题看板_全量流程 5.1 需求分析 主要分析什么内容: 1) 每一个需求涉及到那些维度, 那些直白 2) 每一个需求涉及到那些表, 表的字段 3) 找出需要进行清洗 转换的操作 4) 如果表涉及到多表, 需要找到表与表关联条件 需求一: 计期内&#xff0c;新增…

国货之光!打工人必装的8个软件,你都用过没?|办公|效率|创作

给大家分享8款非常强大&#xff0c;但知名度不高的国产软件&#xff0c;每一个都堪称精品&#xff0c;喜欢的话记得点赞和关注哦~ 第一款是 火绒安全软件 火绒安全软件没有任何&#xff0c;具有推广性质的弹窗、没有捆绑打扰用户的行为&#xff1b;占用资源极少&#xff0c;&a…

Vue.js 2.0 表单控件绑定

基础用法 你可以用 ​v-model​ 指令在表单​ <input>​、​<textarea>​ 及 ​<select>​ 元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。尽管有些神奇&#xff0c;但 ​v-model ​本质上不过是语法糖。它负责监听用户的输入事件…

商品库存管理系统【GUI/Swing+MySQL】(Java课设)

系统类型 Swing窗口类型Mysql数据库存储数据 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址&#xff1a;https://download.csdn.net/download/qq_50954361/87673672 更多系统资源库…

用户信息、账号设置。换做是你会怎么做代码实现?

在网站的应用场景下&#xff0c;对于用户的信息展示与账号设置的都是一个绕不过的问题。解决这个问题&#xff0c;最重要的是&#xff0c;怎么拦截未登录用户进入这个功能内&#xff1f;这就意味着必须在每次动态请求时&#xff0c;校验登录状态以及让请求持有用户&#xff08;…

零入门kubernetes网络实战-28->在同一个宿主机上基于虚拟网桥bridge链接同网段的不同网络命名空间的通信方案

《零入门kubernetes网络实战》视频专栏地址 https://www.ixigua.com/7193641905282875942 本篇文章视频地址(稍后上传) 1、测试环境介绍 一台centos虚拟机 # 查看操作系统版本 cat /etc/centos-release # 内核版本 uname -a uname -r # 查看网卡信息 ip a s eth02、网络拓…

互联网+医疗|如何满足各项安全合规要求

互联网医疗背景下&#xff0c;如何有针对性地规范医疗健康App运营&#xff0c;堵住个人隐私信息安全漏洞&#xff0c;是一个亟待解决的行业问题&#xff0c;也是一个数字时代的公共安全问题。此前&#xff0c;多款医疗健康类App就因过度收集个人信息被监管通报。 与电子商务、…

SDUT操作系统课程(CAST)专题二+专题四参考总结

专题二+进程调度算法 RR q=1(含做题代码) 总结:到达时间一到对应进程进入,执行队首进程一次,对应的服务时间划一记号(推荐用正字),队首进程未执行到完成的话重新进入队尾,队首进程执行到完成的话出队,下一秒继续执行队首进程,当5个进程全部入队之后只要执行后两步操…

5.springcloud微服务架构搭建 之 《springboot集成Hystrix》

1.springcloud微服务架构搭建 之 《springboot自动装配Redis》 2.springcloud微服务架构搭建 之 《springboot集成nacos注册中心》 3.springcloud微服务架构搭建 之 《springboot自动装配ribbon》 4.springcloud微服务架构搭建 之 《springboot集成openFeign》 目录 1.项目…