SpringSecurity集成SpringSession导致反序列化异常
问题:
认证成功后将Authentication存储在Redis中时,取出时遇到反序列化异常。
因为Authentication的Principal是我们自己定义的类并实现了UserDetails接口,并存储了角色权限信息。
反序列化时因为在Principal中加了自定义类,导致反序列化失败。
解决:
将自己定义的类加入到Jackson序列化白名单
在redissession配置类中加入序列化器
@Bean
public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
ObjectMapper mapper = new ObjectMapper();
//将角色菜单信息添加到Jackson序列化白名单中,否则序列化会失败
mapper.addMixIn(RoleDTO.class, RoleDTOMixin.class);
mapper.addMixIn(MenuDTO.class, MenuDTOMixin.class);
mapper.registerModules(SecurityJackson2Modules.getModules(this.getClass().getClassLoader()));
return new GenericJackson2JsonRedisSerializer(mapper);
}
为角色菜单创建mixin类
package edu.nf.user.auth.domain;
import com.fasterxml.jackson.annotation.JsonProperty;
/**
* @ClassName MenuDTOMixin
* @Author THF
* @Date 2023/4/11 9:50
**/
public abstract class MenuDTOMixin {
/**
* @JsonIgnore用来标注该属性不会被序列化/反序列化到Redis中
* 未声明的属性名会默认序列化到Redis中
* 通过Java内省的方式获得属性名
* @return
*/
@JsonIgnore
public abstract Integer getMid();
}