当在认证服务同时进行token获取以及token资源认证可以使用的时候。然后把资源服务整合到其他资源,在这同时又自定义是实现了UserDetails并重写了该接口方法,自定义实现了UserDetailsService,并重写了接口方法,返回使用的是自定义实现的UserDetails。在资源服务器认证token的时候就会出现redis序列化失败的问题, 示例:
/**
* @Description 自定义实现UserDetails
* @Author wwz
* @Date 2019/07/28
* @Param
* @Return
*/
@Data
public class MyUserDetails implements UserDetails {
private AuthUser user;
private Collection<? extends GrantedAuthority> authorities;
public MyUserDetails(AuthUser user, Collection<? extends GrantedAuthority> authorities) {
this.user = user;
this.authorities = authorities;
}
public MyUserDetails() {
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return authorities;
}
其他省略......
/**
* @Description 自定义用户验证数据
* @Author wwz
* @Date 2019/07/28
* @Param
* @Return
*/
@Service
public class MyUserDetailsService implements UserDetailsService {
@Autowired
private AuthUserMapper authUserMapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// 自定义用户权限数据
AuthUser authUser = authUserMapper.selectByUsername(username);
if (authUser == null) {
throw new UsernameNotFoundException("用户名不存在");
}
if (!authUser.getValid()) {
throw new UsernameNotFoundException("用户不可用");
}
Set<GrantedAuthority> grantedAuthorities = new HashSet<>();
// 中间逻辑省略。。。。。。
MyUserDetails userDetails = new MyUserDetails(authUser, grantedAuthorities);
return userDetails;
}
}
org.springframework.data.redis.serializer.SerializationException
导致问题的原因是,在生成token的时候使用了自定义的UserDetails的进行了token序列化,反序列化的时候,在新项目中找不到自定义的实现,只能使用默认的实现来。 解决的方案是就是把自定义实现的UserDetails复制一份到资源项目中。