Я новичок в Spring безопасности. Как добавить прослушиватель событий, который будет успешно вызван журналом пользователя? Также мне нужно получить уникальный идентификатор сеанса в этом слушателе, который должен быть доступен дальше. Мне нужен этот идентификатор для синхронизации с другим сервером.
Spring безопасность: добавление "При успешном прослушивании событий входа в систему"
Ответ 1
Вам нужно определить Spring Bean, который реализует ApplicationListener.
Затем в вашем коде сделайте что-то вроде этого:
public void onApplicationEvent(ApplicationEvent appEvent)
{
if (appEvent instanceof AuthenticationSuccessEvent)
{
AuthenticationSuccessEvent event = (AuthenticationSuccessEvent) appEvent;
UserDetails userDetails = (UserDetails) event.getAuthentication().getPrincipal();
// ....
}
}
Затем в файле applicationContext.xml просто определите, что Bean и он автоматически начнет принимать события:)
Ответ 2
Проблема с AuthenticationSuccessEvent заключается в том, что она не публикуется при входе в login-me. Если вы используете аутентификацию с использованием mem-me, вместо этого используйте InteractiveAuthenticationSuccessEvent, она работает как для обычного входа в систему, так и для входа в систему.
@Component
public class LoginListener implements ApplicationListener<InteractiveAuthenticationSuccessEvent> {
@Override
public void onApplicationEvent(InteractiveAuthenticationSuccessEvent event)
{
UserDetails userDetails = (UserDetails) event.getAuthentication().getPrincipal();
// ...
}
}
Ответ 3
Похож на ответ Фил, но модифицирован, чтобы принимать во внимание Generics:
public class AuthenticationListener implements ApplicationListener<AuthenticationSuccessEvent> {
@Override
public void onApplicationEvent(final AuthenticationSuccessEvent event) {
// ...
}
}
Ответ 4
В Grails с Spring плагином безопасности вы можете сделать это в Config.groovy:
grails.plugins.springsecurity.useSecurityEventListener = true
grails.plugins.springsecurity.onAuthenticationSuccessEvent = { e, appCtx ->
def session = SecurityRequestHolder.request.getSession(false)
session.myVar = true
}