如何处理spring-security-oauth2的版本升级?

spring-security-oauth2 将对象作为数据库中访问令牌条目的一部分保存为序列化的 java 对象 ()。AuthenticationByteArrayOutputStream.writeObject(authentication)

您如何处理spring-security(可能会更改SpringSecurityCoreVersion.SERIAL_VERSION_UID)和spring-security-oauth(可能会更改)的版本升级?如果串行版本 UID 发生更改,则无法再反序列化持久化的身份验证对象。OAuth2Authentication

我们得出的结论是,在升级框架版本时,删除包含序列化身份验证对象的访问令牌将是最干净、最简单的解决方案。任何想法如何更优雅地处理这个问题?


答案 1

我认为最好的解决方案是扔掉代币。在声明旁边有一个很大的评论,上面写着:SpringSecurityCoreVersion.SERIAL_VERSION_UID

/**
 * Global Serialization value for Spring Security classes.
 *
 * N.B. Classes are not intended to be serializable between different versions. See
 * SEC-1709 for why we still need a serial version.
 */

事实上,他们故意(至少)在每个次要版本上颠簸。SERIAL_VERSION_UID

SEC-1709 的问题注释解释了他们是如何找到此解决方案的。

我从评论中得到的是,如果您确实尝试透明地处理版本升级,则可能会导致事情中断,从而产生不可预测的后果。(这是可能出现的安全问题的“代码”。


另一方面,在过去的9年里似乎没有改变。OAuth2Authentication.serialVersionUID


答案 2