Spring Security——集成Spring Session、Redis和JSON序列化解决方案
官方文档
https://docs.spring.io/spring-session/docs/2.4.2/reference/html5/#spring-security
Maven
主要
<!--Spring Security--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><!--Spring Data Redis--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!--Spring Session--><dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-core</artifactId></dependency><!--Spring Data Redis Session--><dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId></dependency>
解决方案
集成Spring Session
Maven
<!--Spring Session--><dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-core</artifactId></dependency>
配置
/*** @author ShenTuZhiGang* @version 1.0.0* @date 2021-02-16 20:27*/
@Configuration
@EnableSpringHttpSession
public class CustomSpringHttpSessionConfig {@Beanpublic MapSessionRepository sessionRepository() {return new MapSessionRepository(new ConcurrentHashMap<>());}}
集成Spring Session Redis
Maven
<dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置
取消Spring Session配置
/*** @author ShenTuZhiGang* @version 1.0.0* @date 2021-02-16 20:27*/
//@Configuration
//@EnableSpringHttpSession
public class CustomSpringHttpSessionConfig {@Beanpublic MapSessionRepository sessionRepository() {return new MapSessionRepository(new ConcurrentHashMap<>());}}
Redis Session配置
@Configuration
public class SecurityConfiguration<S extends Session> extends WebSecurityConfigurerAdapter {@Autowiredprivate FindByIndexNameSessionRepository<S> sessionRepository;@Overrideprotected void configure(HttpSecurity http) throws Exception {// @formatter:offhttp// other config goes here....sessionManagement((sessionManagement) -> sessionManagement.maximumSessions(2).sessionRegistry(sessionRegistry()));// @formatter:on}@Beanpublic SpringSessionBackedSessionRegistry<S> sessionRegistry() {return new SpringSessionBackedSessionRegistry<>(this.sessionRepository);}}
Session Listener
/*** @author ShenTuZhiGang* @version 1.0.0* @date 2021-02-25 10:45*/
@Configuration
@EnableRedisHttpSession
public class CustomRedisHttpSessionConfig {/*** httpSession的会话监听,*/@Beanpublic HttpSessionEventPublisher httpSessionEventPublisher() {return new HttpSessionEventPublisher();}
}
JSON序列化
Jackson2
Redis配置
/*** @author ShenTuZhiGang* @version 1.0.0* @date 2021-03-16 23:12*/
@Configuration
public class CustomRedisConfig {// private ObjectMapper objectMapper = new ObjectMapper();@Autowiredprivate ObjectMapper objectMapper; //需要另外配置,不是重点,自行配置/*** @see org.springframework.security.jackson2.SecurityJackson2Modules* @return Redis序列化器*/@Beanpublic RedisSerializer<Object> redisSerializer(){ObjectMapper om = objectMapper.copy();//om.registerModules(SecurityJackson2Modules.getModules(getClass().getClassLoader()));//om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);om.registerModule(new CoreJackson2Module());//om.registerModule(new CasJackson2Module());om.registerModule(new WebJackson2Module());om.registerModule(new WebServletJackson2Module());om.registerModule(new WebServerJackson2Module());om.registerModule(new OAuth2ClientJackson2Module());SecurityJackson2Modules.enableDefaultTyping(om);return new GenericJackson2JsonRedisSerializer(om);}@Beanpublic RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory);redisTemplate.setDefaultSerializer(redisSerializer());redisTemplate.afterPropertiesSet();return redisTemplate;}
}
Redis Session配置
/*** @author ShenTuZhiGang* @version 1.0.0* @date 2021-02-25 10:45*/
@Configuration
@EnableRedisHttpSession
public class CustomRedisHttpSessionConfig {private final RedisSerializer<Object> redisSerializer;public CustomRedisHttpSessionConfig(RedisSerializer<Object> redisSerializer) {this.redisSerializer = redisSerializer;}/*** Spring Session Redis JSON序列化* *注:bean的名称必须为springSessionDefaultRedisSerializer** @see org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration*/@Beanpublic RedisSerializer<Object> springSessionDefaultRedisSerializer(){return redisSerializer;}/*** httpSession的会话监听,*/@Beanpublic HttpSessionEventPublisher httpSessionEventPublisher() {return new HttpSessionEventPublisher();}
}
Fastjson
同理,参考:Spring Session Redis最佳实践(3)使用Fastjson替换JDK序列化存储
常见问题
Spring Boot——Spring Session Redis整合Spring Security时错误【RedisConnectionFactory is required】解决方案
Spring Security + Spring Session + Redis——【SecurityContext】和【AuthenticationToken】JSON反序列化问题解决方案
Spring Security + Redis Session——JSON序列化错误[The class xxx and name of xxx is not whitelisted. ]解决方案
参考文章
Spring Session & RedisでJacksonを使ったシリアライズを試してみる
Spring Session + Redis——自定义JSON序列化解决方案
Spring Security——集成Spring Session、Redis和JSON序列化解决方案相关推荐
- Spring Session Redis——自定义JSON序列化解决方案
问题描述 Spring Session + Redis--自定义JSON序列化解决方案 问题分析 RedisHttpSessionConfiguration中,Bean名称必须是springSessi ...
- Spring Boot——Spring Session Redis整合Spring Security时错误【RedisConnectionFactory is required】解决方案
问题描述 异常栈栈底 Caused by: java.lang.IllegalStateException: RedisConnectionFactory is requiredat org.spri ...
- .netcore 如何获取系统中所有session_集群化部署,Spring Security 要如何处理 session 共享?
前面和大家聊了 Spring Security 如何像 QQ 一样,自动踢掉已登录用户(Spring Boot + Vue 前后端分离项目,如何踢掉已登录用户?),但是前面我们是基于单体应用的,如果我 ...
- Spring security 集成 JustAuth 实现第三方授权登录
Spring security 集成 JustAuth 实现第三方授权登录脚手架: 一.特性 spring security 集成 JustAuth 实现第三方授权登录 : 此项目从 用户管理脚手架( ...
- Spring Security 集成 Authing CAS 认证(一)
01 集成介绍 单点登录 (Single Sign On),英文名称缩写 SSO,意思是在多系统的环境中,登录单方系统,就可以无须再次登录,访问相关受信任的系统.也就是说,只要登录一次单体系统即可. ...
- 如何用 Spring Security 集成 CAS 认证 (二)
在上一篇文章< Spring Security 集成 Authing CAS 认证(一)>中,我们讲解了很多的基础知识和概念.同时,认证(一)中也讲述了什么是 CAS 协议.什么是单点登录 ...
- Spring MVC实现Spring Security,Spring Stomp websocket Jetty嵌入式运行
使用Spring框架各个组件实现一个在线聊天网页,当有用户连接WebSocket,服务器监听到用户连接会使用Stomp推送最新用户列表,有用户断开刷新在线列表,实时推送用户聊天信息.引入Jetty服务 ...
- spring security logout(spring security登出示例)
** spring security logout(spring security登出示例) ** 在学习实现spring security登出的时候发现了一篇外文,感觉写的挺好,这里斗胆尝试翻译出来 ...
- PART 5: INTEGRATING SPRING SECURITY WITH SPRING BOOT WEB
转自:http://justinrodenbostel.com/2014/05/30/part-5-integrating-spring-security-with-spring-boot-web/ ...
最新文章
- 3dsmax 让物体变透明
- 基于深度卷积神经网络进行人脸识别的原理是什么?
- 从未这么明白的设计模式(一):单例模式
- python 类特殊方法_python中用特殊方法定制类
- 美团酒店Node全栈开发实践
- 委派模式与策略模式综合应用
- 数据结构之最小生成树
- Cloud一分钟 | 阿里云将在英国大区设立数据中心
- 2019年应届生平均起薪5610元 一线城市吸引力首次跌破30%
- 1091 N-自守数 (15 分)—PAT (Basic Level) Practice (中文)
- C语言实现键盘记录器
- python将excel生成pdf_高效办公!Python 批量生成PDF文档
- python源码剖析_Python源码剖析读后感1000字
- 我从不劝退,我就是退。
- jquery weui 上拉加载,下拉刷新,问题解答。
- 如何删除Word 2010中的“向下箭头”
- Linux Wps 缺少字体
- 过去式加ed的发音_过去式,过去分词,加ed 后的读法
- 面向对象:结构化开发方法和面向对象开发方法
- BeatMark X for mac(fcpx音乐卡点神器)
热门文章
- 以Post方式发送数据采用WebClient
- android 首选项框架,Android:创建自定义首选项
- php对应哪个oracle版本,Oracle 版本说明
- python判断是否是英文字母_用python如何判断字符串是纯英文
- sql语言和php,SQL语言快速入门(三)_php
- 求中位数_图解面试题:如何分析中位数?
- C语言写一个简单的数学程序,用C语言计算简单的数学式子
- 对实体 quot;useSSLquot; 的引用必须以 ';' 分隔符结尾
- 二、分布式文件系统HDFS及其简单使用
- 七、Go 语言面向对象编程