Аутентификация OAuth2: сериализованный класс несовместим после обновления Java - PullRequest
0 голосов
/ 07 марта 2019

Вот контекст :

У меня есть приложение Spring Boot, которое использует spring-security для реализации системы OAuth2.Это связано с базой данных MySQL.Я осуществил экспорт моей базы данных mysqldump в моей старой среде (Ubuntu 14.04, mysql 5.5, OpenJDK 6), чтобы импортировать ее в мою новую среду (Ubuntu 18.10, mysl 5.7, OpenJDK 11).

MyПроблема:

Миграция была выполнена с уникальной проблемой:

Spring-Security сохраняет токены как объект Blob в базе данных.Blob на самом деле является сериализованным объектом UserDetails.Обратите внимание, что загрузочное приложение Spring - это один и тот же файл .war в обеих средах, поэтому serialVersionUID, определенный в моем классе Serializable, одинаков.

В моей новой среде токены хранятся в oauth_access_token и oauth_refresh_token теперь непригодны для использования.Каждый раз, когда я пытаюсь войти со старым пользователем (т.е. из старого env с существующим access_token) , выдается следующее исключение:

java.lang.IllegalArgumentException: java.io.InvalidClassException: org.hibernate.collection.internal.AbstractPersistentCollection; local class incompatible: stream classdesc serialVersionUID = -8914173462748164853, local class serialVersionUID = 7094296207968006972
    at org.springframework.security.oauth2.common.util.SerializationUtils.deserialize(SerializationUtils.java:40) ~[spring-security-oauth2-2.0.8.RELEASE.jar!/:na]
    at org.springframework.security.oauth2.provider.token.store.JdbcTokenStore.deserializeAuthentication(JdbcTokenStore.java:405) ~[spring-security-oauth2-2.0.8.RELEASE.jar!/:na]
    at org.springframework.security.oauth2.provider.token.store.JdbcTokenStore$3.mapRow(JdbcTokenStore.java:198) ~[spring-security-oauth2-2.0.8.RELEASE.jar!/:na]
    at org.springframework.security.oauth2.provider.token.store.JdbcTokenStore$3.mapRow(JdbcTokenStore.java:196) ~[spring-security-oauth2-2.0.8.RELEASE.jar!/:na]
    at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:93) ~[spring-jdbc-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:60) ~[spring-jdbc-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:697) ~[spring-jdbc-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:633) ~[spring-jdbc-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:684) ~[spring-jdbc-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:716) ~[spring-jdbc-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:726) ~[spring-jdbc-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:800) ~[spring-jdbc-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    at org.springframework.security.oauth2.provider.token.store.JdbcTokenStore.readAuthentication(JdbcTokenStore.java:195) ~[spring-security-oauth2-2.0.8.RELEASE.jar!/:na]
    at org.springframework.security.oauth2.provider.token.store.JdbcTokenStore.getAccessToken(JdbcTokenStore.java:129) ~[spring-security-oauth2-2.0.8.RELEASE.jar!/:na]

Я понимаю, что сериализованныйОбъект аутентификации, хранящийся в моей базе данных, не может быть десериализован в объекте аутентификации Java из-за другого serialVersionUID.

Мой вопрос:

- Как вы думаете, обновление с Java 6Java 11 может привести к другому serialVersionUID?

- Вы определяете другие пути для выявления причины этого?

...