Использование Spring Security ACL с Spring Data REST
Я пытаюсь авторизовать API, предоставляемые 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, то есть:
@PostFilter("hasPermission(filterObject, 'read') or hasPermission(filterObject, admin)")
List<Book> findAll();
Было бы очень полезно, если кто-то использует ACL с Spring Data REST.
Примечание. Мне известны следующие открытые вопросы:
1 ответ
Решение
Использование JpaRepository было теневым методом List
Для более подробной информации, пример проекта доступен на 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();
}