将 Spring Security ACL 与 Spring Data REST 结合使用

问题描述 投票:0回答:1

我正在尝试授权 Spring Data REST 公开的 api。到目前为止,我能够进行基于角色的授权,即:

@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 结合使用,这将会有很大帮助。

注意:我知道以下未解决的问题:

https://github.com/spring-projects/spring-data-rest/issues/619(以前称为 DATAREST-236)

https://github.com/spring-projects/spring-security/issues/2629(以前称为 SEC-2409)

spring-data-jpa spring-data-rest spring-security-acl
1个回答
45
投票

使用 JpaRepository 隐藏了 List 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();
}
© www.soinside.com 2019 - 2024. All rights reserved.