RedisTokenstore:无法投射......用户...用户

时间:2018-04-14 08:50:39

标签: java spring spring-security spring-security-oauth2

我将Spring的OAuth2应用程序切换到了RedisTokenstore。现在访问校长,主要是通过......

SecurityContextHolder.getContext().authentication.userAuthentication.principal as User

......我得到了......

java.lang.ClassCastException: ...User cannot be cast to ...User

(三个点实际上是完整的类路径)。

我对jave / kotlin很陌生,对模型的理解只是模糊不清。

一些提示:

  • 我非常确定redis令牌存储在此期间不存储,因此内容应该相同(在相关请求中未调用storeAccessToken
  • 我看到readAccessToken被调用两次(我认为这是一次不必要的往返,但这是另一回事)
  • 混淆发生在安全链方法的doFilter方法中,即在第二次走过时。

更新:串口版hickhup是因为我在添加串行后没有刷新redis缓存。所以这只是cannot cast错误。

如何开始调试?

1 个答案:

答案 0 :(得分:1)

spring-devtools实际上存在一个问题:

https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#using-boot-devtools-known-restart-limitations

  

20.2.7已知限制

     

重新启动功能不适用于使用标准ObjectInputStream反序列化的对象。   如果需要反序列化数据,可能需要使用Spring   ConfigurableObjectInputStream与   Thread.currentThread()。getContextClassLoader()。

     

不幸的是,有些第三方库没有反序列化   考虑上下文类加载器。如果你发现这样的问题,你   需要向原作者请求修复。

一种选择是升级到spring-boot 2。+

另一种方法是在不需要它的情况下完全删除devtools。下面是一个示例,如果您使用Maven将从1.3.0及更高版本中删除任何版本:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <version>[1.3.0,)</version>
    <scope>provided</scope>
</dependency>

确保在完成后首先冲洗Redis以进行验证。