Java Spring Security principal isn';Tomcat重新启动后未完全填充

Java Spring Security principal isn';Tomcat重新启动后未完全填充,java,spring,spring-security,Java,Spring,Spring Security,简言之,在服务器重启(我自己的本地Tomcat)之后,Spring安全主体对象将重新填充除用户ID字段之外的每个字段(用户名、密码、电子邮件、用户类型等) 我有以下用户对象,它实现了Spring的UserDetails对象,并扩展了我自己的基本对象类: public class User extends BaseDomainObject implements UserDetails { private String username; private String emailAd

简言之,在服务器重启(我自己的本地Tomcat)之后,Spring安全主体对象将重新填充除用户ID字段之外的每个字段(用户名、密码、电子邮件、用户类型等)

我有以下用户对象,它实现了Spring的UserDetails对象,并扩展了我自己的基本对象类:

public class User extends BaseDomainObject implements UserDetails {
    private String username;
    private String emailAddress;
    private String password;
    // ... etc ... /
}
(仅供参考,用户类有一个构造函数,它接受除ID(由hibernate偷偷注入)之外的所有字段。此对象上没有设置器。不确定这是否重要。)

用户ID字段位于BaseDomainObject中:

class BaseDomainObject {
    protected Long id;
    public Long getId() {
        return id;
    }
}
成功登录后,主体将填充上述用户详细信息(包括ID),一切都很顺利。这通过以下日志输出(其中包括以User[id,username,emailAddress]的形式表示的上述用户类的toString表示)得到确认:

但是,服务器重新启动后,相同的日志输出如下所示:

2011-07-26 11:52:28,355 DEBUG [org.springframework.security.web.context.HttpSessionSecurityContextRepository] - Obtained a valid SecurityContext from SPRING_SECURITY_CONTEXT: 'org.springframework.security.core.context.SecurityContextImpl@729a68c9: Authentication: org.springframework.security.authentication.UsernamePasswordAuthenticationToken@729a68c9: Principal: User[null,test,test@test.com]; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@255f8: RemoteIpAddress: 0:0:0:0:0:0:0:1%0; SessionId: 450FFF87C04098ECC58C2E0829D21D69; Granted Authorities: ROLE_USER, ROLE_CUSTOMER'
我应该重申,User类(不在基类中)上还有其他字段也已成功填充。基本上什么都有,除了身份证

Spring安全性在设置字段时是否调用用户构造函数?诚然,我从来没有真正想过春天如何让其他的田地重新生长——也许这就是我的问题?我真的不想在构造函数中用setter/公开ID字段。事实上,向构造函数添加ID并没有任何作用


感谢您的帮助。

我建议确保您的两个域对象
都实现了可序列化的
,否则servlet容器可能会选择不将它们序列化到磁盘(这就是重新启动后重新填充会话数据的方式-Tomcat正在读取序列化到文件的会话数据).

能否将自定义userDetailService的实现粘贴到安全上下文xml中的何处?这两个类不都应该实现可序列化的
吗?如果您想了解域对象是如何重新填充的,为什么不设置一个断点并附加一个调试器呢。添加Serializable可修复此问题。如果您想回答下面的问题,我可以接受您的回答?更多详细信息:查看SecurityContextPersistenceFilter类,它定义了SecurityContextHolder的填充方式。如果您使用的是HttpSessionSecurityContextRepository,那么用户的安全上下文(成功认证后由Spring分配的内容)将存储在HTTP会话中。如果servlet容器保持会话并在重新启动后恢复会话,那么您应该在那里进行检查。
2011-07-26 11:52:28,355 DEBUG [org.springframework.security.web.context.HttpSessionSecurityContextRepository] - Obtained a valid SecurityContext from SPRING_SECURITY_CONTEXT: 'org.springframework.security.core.context.SecurityContextImpl@729a68c9: Authentication: org.springframework.security.authentication.UsernamePasswordAuthenticationToken@729a68c9: Principal: User[null,test,test@test.com]; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@255f8: RemoteIpAddress: 0:0:0:0:0:0:0:1%0; SessionId: 450FFF87C04098ECC58C2E0829D21D69; Granted Authorities: ROLE_USER, ROLE_CUSTOMER'