【问题标题】:RedisTokenstore: Cannot cast ...User to ...UserRedisTokenstore:无法将 ...User 转换为 ...User
【发布时间】:2018-04-15 06:07:42
【问题描述】:

我将我的 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 错误。

如何开始调试?

【问题讨论】:

  • 我知道您试图让我们更容易理解,但您不应该将类路径替换为 ...,因为这会使我们更难为您提供帮助。

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


【解决方案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。

【讨论】:

  • 我使用最新的弹簧靴。删除 devtools 没有帮助。
  • 删除开发工具确实有效。我只需要刷新redis。谢谢。
  • @shredding 我将更新答案以包括刷新 redis。很高兴它对你有用。
猜你喜欢
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-13
  • 2020-01-22
  • 2021-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多