MDCFilter с Spring webflux с использованием нетто реактора и безопасности пружины - PullRequest
0 голосов
/ 18 октября 2019

У меня есть следующий код, это MDCFilter.

import org.slf4j.MDC;
import org.springframework.security.oauth2.provider.OAuth2Authentication;
import org.springframework.security.oauth2.server.resource.authentication.BearerTokenAuthentication;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
import reactor.core.publisher.Mono;

public class NettyMDCFilter implements WebFilter {

    public static final String USER_AND_APPLICATION_KEY = "user";
    public static final String APPLICATION_KEY = "application";
    public static final String USERNAME_KEY = "username";

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        return exchange.<OAuth2Authentication>getPrincipal()
            .doOnNext(this::logWithContext)
            .map(auth -> exchange)
            .switchIfEmpty(Mono.just(exchange))
            .flatMap(chain::filter)
            .doFinally(signalType -> removeMDCKeys());
    }

    private void logWithContext(OAuth2Authentication authentication) {
        MDC.put(USER_AND_APPLICATION_KEY, userKey(authentication));
        if (authentication.isClientOnly()) {
            MDC.put(APPLICATION_KEY, authentication.getName());
        } else {
            MDC.put(APPLICATION_KEY, authentication.getOAuth2Request().getClientId());
            MDC.put(USERNAME_KEY, authentication.getName());
        }
    }

    private void removeMDCKeys() {
        MDC.remove(USER_AND_APPLICATION_KEY);
        MDC.remove(USERNAME_KEY);
        MDC.remove(APPLICATION_KEY);
    }

    private String userKey(OAuth2Authentication authentication) {
        if (authentication.isClientOnly()) {
            return authentication.getName();
        } else {
            return String.format("%s:%s", authentication.getOAuth2Request().getClientId(), authentication.getName());
        }
    }
}

В предыдущей реализации был реализован класс OAuth2Authentication , который принадлежит проекту проекта spring-security-oauth , но этот проект сейчасв режиме обслуживания, как вы можете видеть здесь . В моем коде я хочу проверить в фильтре, принадлежит ли токен клиентскому приложению или пользователю, но я не имею ни малейшего представления о том, как я могу это сделать в новой версии spring-security , даже читая документацию, мне непонятно, что мне следует делать, потому что нет руководства по миграции с проекта spring-security-oauth2 на новую версию проекта обеспечения безопасности Spring со встроенной поддержкой oauth2. Я погуглил, но не смог найти конкретного учебника, который бы помог мне с этой проблемой.

...