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();

}
最后修改:2023 年 04 月 12 日
如果觉得我的文章对你有用,请随意赞赏