2011-07-26 2 views
3

나의 질문은 서버 재시작 (내 자신의 로컬 Tomcat), Spring Security principal 객체가 모든 필드 (사용자 이름, 패스워드, 이메일, userType, 등) 사용자 ID 필드를 제외하고. Tomcat을 재시작 한 후 스프링 보안 사용자가 완전히 채워지지 않는다.

나는이 봄의 된 UserDetails 객체도 내 자신의 기본 오브젝트 클래스를 확장 구현 다음 사용자 개체 :

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

(참고로, 사용자 클래스는 ID를 제외한 모든 필드를 받아들이는 생성자 (인이 저변에서) 최대 절전 모드로 주입 더 세터가이 객체에 없는지가 중요한 경우 확실하지 않음)

사용자 ID 필드의 삶을 BaseDomainObject에 :...

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

로그인에 성공하면 주 사용자는 위의 사용자 세부 정보 (ID 포함)로 채워지고 모든 것이 행복합니다. 이것은 (형태 사용자 위에서 User 클래스의를 toString 표현을 포함한다 [ID, 이름, EMAILADDRESS]) 다음 로그 출력에 의해 확인된다 : 서버 재시작 다음 그러나

2011-07-26 11:50:25,188 DEBUG [org.springframework.security.web.context.HttpSessionSecurityContextRepository] - Obtained a valid SecurityContext from SPRING_SECURITY_CONTEXT: '[email protected]8fac5a: Authentication: org.springframew[email protected]5e8fac5a: Principal: User[1,test,[email protected]]; Credentials: [PROTECTED]; Authenticated: true; Details: org.sprin[email protected]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: '[email protected]9a68c9: Authentication: org.springframew[email protected]729a68c9: Principal: User[null,test,[email protected]]; Credentials: [PROTECTED]; Authenticated: true; Details: org.sprin[email protected]255f8: RemoteIpAddress: 0:0:0:0:0:0:0:1%0; SessionId: 450FFF87C04098ECC58C2E0829D21D69; Granted Authorities: ROLE_USER, ROLE_CUSTOMER' 

나는 또한 성공적으로 채워집니다 (안 기본 클래스에서) 사용자 클래스의 다른 필드가 있다는 것을 반복한다. 기본적으로 ID를 제외한 모든 것.

필드를 설정할 때 Spring 보안이 User 생성자를 호출합니까? 틀림없이 나는 스프링이 나머지 필드를 다시 채우는 "방법"에 대해 정말로 생각해 본 적이 없다. 아마도 내 문제 일까? 정말 ID 필드를 setter /로 생성자에서 노출하고 싶지 않습니다. 사실, ID를 생성자에 추가하는 것은 아무 것도하지 않습니다.

어떤 도움을 주셔서 감사합니다.

+0

사용자 정의 userDetailService 구현과 보안 컨텍스트 xml에서 호출하는 위치를 붙여 넣을 수 있습니까? –

+0

두 클래스가 모두'Serializable'을 구현하지 않아야합니까? 도메인 객체가 어떻게 채워지는지 알고 싶다면 중단 점을 설정하고 디버거를 연결하는 것이 어떻습니까? –

+1

* 신음 * 당신은 맞다. b - UserDetails는 Serializable을 확장하지만 BaseDomainObject는 확장하지 않는다. Serializable을 추가하면 문제가 해결됩니다. 아래에서 대답하고 싶으면 대답을 수락 할 수 있습니까? –

답변

7

도메인 개체가 모두 implements Serializable인지 확인하십시오. 그렇지 않으면 서블릿 컨테이너가 디스크에 직렬화하지 않을 가능성이 있습니다 (세션 데이터가 다시 시작된 후 다시 채워지는 방식입니다) - Tomcat이 직렬화 된 세션 데이터를 읽는 중입니다. 파일).

+3

몇 가지 세부 정보 : SecurityContextHolder가 채워지는 방법을 정의하는 SecurityContextPersistenceFilter 클래스를 확인하십시오. HttpSessionSecurityContextRepository를 사용하고 있다면, 사용자의 보안 컨텍스트 (성공적인 인증시 Spring에 의해 할당 된 것)는 HTTP 세션에 저장됩니다. 그리고 서블릿 컨테이너가 세션을 유지하고 다시 시작한 후에 세션을 복원하면 거기에서 확인해야합니다. – jtoberon

관련 문제