Предположим, что следующий репозиторий на основе Spring JPA с поддержкой QueryDsl.
@Repository
public interface TeamRepository extends JpaRepository<Team, Long>, QuerydslPredicateExecutor<Team> {
}
Приложение использует Списки контроля доступа (ACL) в сервисном слое для проверки разрешения для отдельных ресурсов с использованием * Например, 1006 *.
Я хочу разрешить пользователю запрашивать все команды, для которых у него есть разрешение на чтение. Я пытался использовать @PostFilter(hasPermission(filterObject, 'READ')
, это работает довольно хорошо, пока я использую Iterable<Team> findAll(Predicate predicate)
. Но когда я пытаюсь использовать нумерацию страниц, @PostFilter
, похоже, выдает исключение.
java.lang.IllegalArgumentException: Filter target must be a collection, array, or stream type, but was Page 1 of 0 containing UNKNOWN instances
Официальная Справочная документация по безопасности Spring рекомендует написать пользовательский запрос, используя @Query
который поддерживает разбиение на страницы.
Как можно написать такой сложный запрос, который поддерживает Предикат QueryDsl , Пагинация и фильтрация на основе разрешений ?
Подход 03/24/20
В другом форуме Я столкнулся со следующим подходом на основе QueryDsl: Вместо собственного или пользовательского запроса, таблицы ACL отображаются как @Immutable
сущности JPA, таким образом генерируя классы Q и используя их для ручной фильтрации разрешений.
@Entity
@Immutable
@Table(name = "acl_object_identity")
public class AclObjectIdentity implements Serializable {
...
}
Как это можно сделать с помощью собственного репозитория, расширяющего QueryDslRepositorySupport
, чтобы часть запроса, проверяющая разрешения, автоматически добавлялась и скрывалась внутри пользовательской реализации репозитория?