Учитывая изменения в журнале, которые были выполнены в https: // github. com / spring-projects / spring-security-oauth / issues / 1271 и https://github.com/spring-projects/spring-security-oauth/issues/1290, я думаю, может быть трудно угодить всем ведением журнала, которое присутствует в конечной точке токена. Например, я хотел бы поймать все, что относится к простому @ExceptionHandler(Exception.class), как сообщение об ошибке с журналом с трассировкой стека.

Как лучше всего перехватить исключения, возникающие в конечной точке ошибки, чтобы можно было применить настраиваемое ведение журнала?

1
Ronnie76er 13 Мар 2018 в 07:24

2 ответа

Лучший ответ

Мы решили это решить с помощью spring-aop. Мы просто перехватили правильные места и при этом записали сообщение об ошибке:

@Slf4j
@Aspect
@Component
public class OAuthErrorLoggingAspect {

    private static final String ERROR_MESSAGE = "Error during token generation: ";

    @Before("execution("
            + "public * "
            + "org.springframework.security.oauth2.provider.endpoint"
            + ".TokenEndpoint.handleException(Exception)) && args(ex))")
    public void handleExceptionLogging(Exception ex) {
        if (ex instanceof ClientAbortException) {
            log.debug(ERROR_MESSAGE, ex);
        } else {
            log.error(ERROR_MESSAGE, ex);
        }
    }

    @Before("execution("
            + "public * "
            + "org.springframework.security.oauth2.provider.endpoint"
            + ".TokenEndpoint.handleHttpRequestMethodNotSupportedException("
            + "org.springframework.web.HttpRequestMethodNotSupportedException)) && args(ex))")
    public void handleHttpRequestMethodNotSupportedLogging(HttpRequestMethodNotSupportedException ex) {
        log.debug(ERROR_MESSAGE, ex);
    }

    @Before("execution("
            + "public * "
            + "org.springframework.security.oauth2.provider.endpoint"
            + ".TokenEndpoint.handleClientRegistrationException("
            + "Exception)) && args(ex))")
    public void handleClientRegistrationErrorLogging(Exception ex) {
        log.debug(ERROR_MESSAGE, ex);
    }

    @Before("execution("
            + "public * "
            + "org.springframework.security.oauth2.provider.endpoint"
            + ".TokenEndpoint.handleException("
            + "org.springframework.security.oauth2.common.exceptions.OAuth2Exception)) && args(ex))")
    public void handleOAuth2ExceptionLogging(OAuth2Exception ex) {
        log.debug(ERROR_MESSAGE, ex);
    }

}
0
Ronnie76er 4 Май 2018 в 17:56

Мы можем использовать переопределить обработчик исключений HandlerExceptionResolverComposite, определенный в WebMvcConfigurationSupport. Это объединит все преобразователи исключений в один преобразователь исключений. Затем мы можем определить ваши собственные преобразователи исключений.

Один из преобразователей исключений, который мы можем использовать, - это ExceptionHandlerExceptionResolver, это позволит обрабатывать исключения на основе АОП, включая классы с аннотацией @ControllerAdvice.

В нашем пользовательском совете по контроллеру мы можем использовать обработчик для разных исключений:

@ExceptionHandler({OAuth2Exception.class})
public ResponseEntity<Object> handleOAuth2Exception(final OAuth2Exception exception, final WebRequest request) {
    LOGGER.debug("OAuth failed on request processing", exception);
0
Vijay Nandwana 13 Мар 2018 в 06:03