Как реализовать Spring Security @PostFilter для разных типов при использовании OAuth

Я использую 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 в целом.


person JIMI    schedule 18.01.2016    source источник


Ответы (1)


Фильтровать данные на уровне службы

@Service
class TamasServiceImpl implement TamasService{
    @PostFilter
    public Iterable<TamasUser> loadAll(){
        // return you data here
    }
}

затем в контроллере

@Autowired
TamasService service;

@Get
public ResponseEntity<Iterable<TamasUser>> loadAll(){
    return new ResponseEntity<>(service.loadAll(),HttpStatus.FOUND)
}
person KSTN    schedule 19.01.2016
comment
Хорошая идея :) Я был так настроен на наличие аннотаций безопасности в методах контроллера, что мне это даже не пришло в голову. Но в нашей команде мы договорились о наличии этих аннотаций, и я не навязываю изменения, основываясь только на этой незначительной проблеме. Я хотел бы найти более удобное и чистое решение для модификации @PostFilter для работы с ResponseEntity‹›. - person JIMI; 19.01.2016