我有一个带有安全性、devtools、vaadin 和嵌入式 tomcat 的 Spring Boot 应用程序。
我已经根据本指南配置了 Spring 安全性:VAADIN-securering-your-app-with-spring-security它运行良好,我可以登录......等等,但是当我改变一些东西并且我想重新加载时,服务器重新启动,但无法反序列化持久会话,并提示我再次登录。
反序列化错误是指 org.springframework.security.authentication.UsernamePasswordAuthenticationToken 的主体字段,在我的例子中是 String。
请参阅下面的详细信息。
构建.gradle:
plugins {
id 'org.springframework.boot' version '2.4.5'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'com.vaadin' version '20.0.2'
id 'java'
id 'war'
}
...
ext {
set('vaadinVersion', "20.0.2")
}
...
dependencies {
developmentOnly 'org.springframework.boot:spring-boot-devtools'
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
implementation 'com.vaadin:vaadin-spring-boot-starter'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-security'
...
}
应用程序属性:
vaadin.servlet.productionMode=false
server.servlet.session.persistent=true
server.tomcat.basedir=/tmp
spring.devtools.restart.poll-interval=3s
spring.devtools.restart.quiet-period=2s
身份验证提供者:
...
@Override
public Authentication authenticate(Authentication authentication)
throws AuthenticationException {
String name = authentication.getName();
String password = authentication.getCredentials().toString();
authService.authenticate(name, password);
List<GrantedAuthority> authorities = authService.getAuthorities(name);
return new UsernamePasswordAuthenticationToken(name, password, authorities);
}
错误:
无法反序列化会话属性 [com.vaadin.flow.server.VaadinSession.springServlet]
java.io.InvalidClassException: org.springframework.security.authentication.UsernamePasswordAuthenticationToken; java.io.ObjectStreamClass.readNonProxy(ObjectStreamClass.java:807) 的字段主体的无效描述符 ~[na:1.8.0_202] 在 java.io.ObjectInputStream.readClassDescriptor(ObjectInputStream.java:891) ~[na:1.8.0_202 ] 在 java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1857) ~[na:1.8.0_202] 在 java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1751) ~[na:1.8.0_202] 在 java. io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2042) ~[na:1.8.0_202] at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573) ~[na:1.8.0_202] at java.io.ObjectInputStream。 defaultReadFields(ObjectInputStream.java:2287) ~[na:1.8.0_202] at java.io.ObjectInputStream.readSerialData(ObjectInputStream.