Подтвердить что ты не робот

Использование Spring ACL безопасности с Spring Data REST

Я пытаюсь разрешить apis, выставленный Spring Data REST. До сих пор я могу выполнять авторизацию на основе ролей, а именно:

@RepositoryRestResource(path = "book")
public interface BookRepository extends JpaRepository<Book, Long> {

    @PreAuthorize("hasRole('ROLE_ADMIN')")
    <S extends Book> Book save(Book book);
}

Также в том же проекте у меня есть сервисный уровень с механизмом ACL, который работает.

Я не могу использовать выражение PostFilter с Spring Data REST i.e:

@PostFilter("hasPermission(filterObject, 'read') or hasPermission(filterObject, admin)")
List<Book> findAll();

Было бы очень полезно, если кто-либо использует ACL с Spring Data REST.

Примечание. Мне известны следующие проблемы:

https://jira.spring.io/browse/DATAREST-236

https://jira.spring.io/browse/SEC-2409

4b9b3361

Ответ 1

используя JpaRepository, был скрыт список <Book> findAll(). Затем я использовал CrudRepository, и PostFilter был применен.

Для получения более подробной информации, пример проекта доступен в GitHub: https://github.com/charybr/spring-data-rest-acl

Авторизация на основе ACL работает для ниже объекта, открытого Spring Data REST.

import org.springframework.data.repository.CrudRepository;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
import org.springframework.security.access.method.P;
import org.springframework.security.access.prepost.PostFilter;
import org.springframework.security.access.prepost.PreAuthorize;

@RepositoryRestResource(path = "book")
public interface BookRepository extends CrudRepository<Book, Long> {

    @PreAuthorize("hasRole('ROLE_ADMIN') or hasPermission(#book, 'write')")
    <S extends Book> Book save(@P("book") Book book);

    @Override
    @PostFilter("hasPermission(filterObject, 'read') or hasPermission(filterObject, admin)")
    Iterable<Book> findAll();
}