Как получить текущий принципал в приложении Spring Boot, которое использует хранилище сеансов Redis - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть несколько приложений микросервиса Spring Boot (выпуск 1.5.3), которые все используют хранилище сеансов Redis.У меня есть следующие зависимости от пути к классам, и пользователи могут входить в систему, а их сеансы хранятся в Redis:

<dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>

Конечные точки контроллера в каждом микросервисе используют аннотацию @Preauthorize, чтобы гарантировать, что текущий пользователь получил соответствующие права.полномочия для вызова конечной точки.Кажется, что безопасность настроена правильно, так как эти аннотации действительно гарантируют, что могут вызывать только те пользователи с правильными ролями.Однако мне также необходимо вывести имя пользователя, который пытается вызвать конечную точку, в журнал аудита.Для этого у меня есть следующий метод, который должен возвращать имя пользователя в виде строки:

private String userDetailsString() {
    StringBuilder buf = new StringBuilder();
    SecurityContext context = getSecurityContext();
    Authentication authentication = context.getAuthentication();
    if(authentication != null) {
        UserDetails principal = (UserDetails)authentication.getPrincipal();
        buf.append("Requested by: ");
        buf.append(principal.getUsername());
    } else {
        buf.append("Requested by: null");
    }
    return buf.toString();
}

protected SecurityContext getSecurityContext() {
    return SecurityContextHolder.getContext();
}

Тем не менее, объект аутентификации всегда нулевой.Почему это?И каковы предпочтительные способы доступа к текущему Принципалу в таком приложении?Обратите внимание, что этот код должен находиться за пределами класса Controller.

Я предполагаю, что код аннотации @Preauthorize должен каким-то образом обращаться к этому принципалу, чтобы определить, имеют ли они соответствующие роли?

1 Ответ

0 голосов
/ 17 сентября 2018

Вы можете использовать EventListener для успеха: AuthorizedEvent или неудачи AuthorizationFailureEvent

@EventListener(value = {AuthorizedEvent.class})
public void onApplicationEvent(AuthorizedEvent event) {
   log.info("Authorization : {}", event.getAuthentication().getName());
}
...