Участник Spring Security не полностью заполнен после перезагрузки Tomcat - PullRequest
3 голосов
/ 26 июля 2011

Мой вопрос вкратце: после перезапуска сервера (мой собственный локальный Tomcat) основной объект Spring Security заполняется каждым полем (имя пользователя, пароль, адрес электронной почты, userType и т. Д.) , за исключением пользователяПоле идентификатора.

У меня есть следующий объект User, который реализует объект Spring UserDetails, а также расширяет мой собственный базовый класс объектов:

public class User extends BaseDomainObject implements UserDetails {
    private String username;
    private String emailAddress;
    private String password;
    // ... etc ... /
}

(FYI, класс User имеет конструктор, который принимает всеполя, кроме идентификатора (который незаметно вводится hibernate). У этого объекта нет сеттеров. Не уверен, что это важно.)

Поле идентификатора пользователя находится в BaseDomainObject:

class BaseDomainObject {
    protected Long id;
    public Long getId() {
        return id;
    }
}

После успешного входа в систему принципал заполняется указанными выше данными пользователя (включая идентификатор), и все устраивает.Это подтверждается следующим выводом журнала (который включает в себя представление toString класса User выше в форме User [id, username, emailAddress]):

2011-07-26 11:50:25,188 DEBUG [org.springframework.security.web.context.HttpSessionSecurityContextRepository] - Obtained a valid SecurityContext from SPRING_SECURITY_CONTEXT: 'org.springframework.security.core.context.SecurityContextImpl@5e8fac5a: Authentication: org.springframework.security.authentication.UsernamePasswordAuthenticationToken@5e8fac5a: Principal: User[1,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'

Однако после перезапуска сервера то же самоевывод журнала выглядит следующим образом:

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 есть другие поля (не в базовом классе), которые также успешно заполнены.В основном все, кроме ID.

Вызывает ли Spring Security конструктор User при настройке полей?По общему признанию, я никогда не задумывался о том, «как» Spring заполняет остальные поля - возможно, это моя проблема?Я действительно не хотел выставлять поле идентификатора с помощью сеттера / в конструкторе.На самом деле, добавление ID в конструктор ничего не делает.

Спасибо за любую помощь.

1 Ответ

7 голосов
/ 26 июля 2011

Я бы посоветовал убедиться, что оба ваших доменных объекта implements Serializable, в противном случае контейнер сервлета, скорее всего, может не сериализовать их на диск (именно так данные вашего сеанса повторно заполняются после перезапуска - Tomcat читает данные сеанса сериализованнымив файл).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...