it-swarm.com.ru

Spring security: добавление "При успешном прослушивании событий входа в систему"

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

35
axk

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

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

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

        // ....
    }
}

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

46
user7094

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

@Component
public class LoginListener implements ApplicationListener<InteractiveAuthenticationSuccessEvent> {

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

Аналогичен ответу Филла, но изменен, чтобы принять во внимание Generics:

public class AuthenticationListener implements ApplicationListener<AuthenticationSuccessEvent> {

  @Override
  public void onApplicationEvent(final AuthenticationSuccessEvent event) {

      // ...

  }

}
24
user1857829

В 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

}
10
Wanderson Santos

Еще один способ использования @EventListener

@EventListener
public void doSomething(InteractiveAuthenticationSuccessEvent event) { // any spring event
    // your code 

}
0
Sujit