Я использую Spring Boot, Spring Security Oauth и Spring Security в своем проекте, который представляет собой сервер REST, который возвращает ResponseEntity<>
из методов своего контроллера.
Теперь, когда я добавляю аннотацию @PostFilter
к методу контроллера, который возвращает ResponseEntity<Iterable<WebUser>>
, впоследствии происходит сбой выполнения, потому что метод filter(Object filterTarget, Expression filterExpression, EvaluationContext ctx)
может работать только с объектами типа Collection
и Array
. Невозможно извлечь коллекцию из ResponseEntity.
Теперь мой ответ состоял в том, чтобы расширить DefaultMethodSecurityExpressionHandler
реализацию метода фильтра с извлечением из ResponseEntity и его использованием, имея класс @EnableGlobalMethodSecurity
, который расширяет GlobalMethodSecurityConfiguration
и переопределяет метод createExpressionHandler()
.
Вышеприведенное будет работать, если я не буду использовать Spring Security OAuth, потому что, как я узнал, OAuth2MethodSecurityConfiguration
создает свой собственный OAuth2MethodSecurityExpressionHandler
, а мой пользовательский не создается.
Решение состояло в том, чтобы скопировать весь класс OAuth2MethodSecurityConfiguration
в мой проект и изменить одну строку, чтобы он создал MyOAuth2MethodSecurityExpressionHandler extends OAuth2MethodSecurityExpressionHandler
, извлекающий ResponseEntity
, но это решение кажется мне хакерским.
Итак, наконец, вопрос, который я хотел бы задать, есть ли лучший способ решить эту проблему. Возможно, я подошел к этому с плохого угла и пропустил более простое решение.
РЕДАКТИРОВАТЬ: Обойти проблему, безусловно, тоже можно, но я в основном ищу другие (более чистые) способы настройки Spring @PostFilter для работы с ResponseEntity‹> (если они есть), чтобы лучше понять Spring Boot в целом.