2008-10-08 12 views
32

Я новичок в Spring Security. Как добавить прослушиватель событий, который будет успешно вызван журналом пользователя? Также мне нужно получить уникальный идентификатор сеанса в этом слушателе, который должен быть доступен дальше. Мне нужен этот идентификатор для синхронизации с другим сервером.Весенняя безопасность: добавление «При успешном прослушивании входа в систему» ​​

ответ

41

Вам необходимо определить Spring Bean, который реализует ApplicationListener.

Затем в коде, сделать что-то вроде этого:

public void onApplicationEvent(ApplicationEvent appEvent) 
{ 
    if (appEvent instanceof AuthenticationSuccessEvent) 
    { 
     AuthenticationSuccessEvent event = (AuthenticationSuccessEvent) appEvent; 
     UserDetails userDetails = (UserDetails) event.getAuthentication().getPrincipal(); 

     // .... 
    } 
} 

Затем в файле applicationContext.xml, просто определить, что боб, и он будет автоматически начнет получать события :)

+0

Спасибо! Просто нашел AuthenticationSuccessEvent, но пытался выяснить, как зарегистрировать слушателя. – axk 2008-10-08 12:36:35

+2

как насчет идентификатора сеанса, о котором он спрашивал? – siebmanb 2015-02-26 10:28:29

+1

@siebmanb просто добавляет `@Autowired HttpSession session` к слушателю. Spring добавит прокси-сервер, который автоматически передает на сеанс коррекции. – 2016-02-17 22:43:11

10

In Grails с Spring Security Plugin, вы можете сделать это в Config.groovy:

grails.plugins.springsecurity.useSecurityEventListener = true 

grails.plugins.springsecurity.onAuthenticationSuccessEvent = { e, appCtx -> 

     def session = SecurityRequestHolder.request.getSession(false) 
     session.myVar = true 

} 
21

Подобный ответ Филл, но изменен, чтобы принять во внимание Generics:

public class AuthenticationListener implements ApplicationListener<AuthenticationSuccessEvent> { 

    @Override 
    public void onApplicationEvent(final AuthenticationSuccessEvent event) { 

     // ... 

    } 

} 
38

Проблема с AuthenticationSuccessEvent заключается в том, что она не публикуется при запоминании логина. Если вы используете аутентификацию с использованием mem-me, используйте InteractiveAuthenticationSuccessEvent вместо этого, она работает для обычного входа в систему, а также для входа в систему для входа в систему.

@Component 
public class LoginListener implements ApplicationListener<InteractiveAuthenticationSuccessEvent> { 

    @Override 
    public void onApplicationEvent(InteractiveAuthenticationSuccessEvent event) 
    { 
     UserDetails userDetails = (UserDetails) event.getAuthentication().getPrincipal(); 
     // ... 
    } 
}