2010-12-28 2 views
0

grails 및 spring-security 3.0.3을 사용하여 웹 응용 프로그램을 작성하고 있는데,이를 포함하여 모든 성공적인 로그인의 데이터베이스 레코드를 유지해야합니다. 사용자 이름, 시간, ip 및 sessionId.봄 보안 로그인 이벤트 리스너 내에서 "remember me"사용자의 세션 ID를 얻을 수 없습니다.

내가 그렇게 (그루비 코드)로 로그인 리스너를 만들었습니다

class DpLoginListener implements ApplicationListener<InteractiveAuthenticationSuccessEvent> { 
    void onApplicationEvent(InteractiveAuthenticationSuccessEvent event) { 
     def source = event.getSource() 
     def principal = source.principal 
     def details = source.details 
     TrafficLogin.withTransaction { 
      new TrafficLogin(userId: principal.id, ipAddress: details.remoteAddress, sessionId: details.sessionId ?: 'remember me').save(failOnError: true) 
     } 
    } 
} 

이 화재를 예상대로 사용자가 로그인 할 때,하지만 누군가가 "나를 기억"사용자로 사이트에 돌아 오면, sessionId가 null입니다. 이것은 예상 된 행동입니까? 로그인이 성공할 때까지 세션을 만들어야하지 않습니까?

별도의 SessionCreationEvent 수신기를 추가하여이 문제를 해결하려고했습니다.이 수신기는 사용자가 사용할 수있는 최신 데이터베이스 로그인 레코드를 찾아 세션이 존재하는 즉시 올바른 세션 ID로 업데이트합니다.하지만이 세션 생성 이벤트 절대로 불을 지르지 않고 왜 그럴 수 없는지.

class DpSessionCreatedListener implements ApplicationListener<SessionCreationEvent> { 
    void onApplicationEvent(SessionCreationEvent event) { 
    def source = event.getSource() 
    def principal = source.principal 
    def details = source.details 
    TrafficLogin.withTransaction { 
     def rememberMe = TrafficLogin.find("from TrafficLogin as t where t.userId=? and t.sessionId='remember me' order by t.dateCreated desc", principal.id) 
     if (rememberMe) { 
     rememberMe.sessionId = details.sessionId 
     rememberMe.save(failOnError:true) 
     } 
    } 
    } 
} 

을 그리고 빈은 잘 화재 로그인 청취자와 동일한 방식으로, 내 resources.groovy 파일에 대해 정의 :

세션 생성 리스너는 다음과 같습니다.

이 세션 ID를 올바르게 설정하는 방법에 대한 아이디어가 있으십니까?

답변

2

grails와 관련이 없지만, grails가 지원하는 경우이 SO question이 해결 방법을 제공 할 수 있습니다.

+0

감사합니다. 거기에 대한 해결책이 저에게 효과적이었습니다. – peepsalot

관련 문제