2014-10-24 31 views
13

Tôi đang cố gắng ủy quyền cho apis được Spring Data REST tiếp xúc. Cho đến nay tôi có thể thực hiện ủy quyền dựa trên vai trò, ví dụ:Sử dụng ACL Spring Security với dữ liệu Spring REST

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

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

Cũng trong cùng một dự án tôi có một lớp dịch vụ với cơ chế ACL đang hoạt động.

Tôi không thể sử dụng biểu PostFilter với mùa xuân dữ liệu REST của tức là:

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

Nó sẽ giúp đỡ rất nhiều, nếu có ai sử dụng ACL với mùa xuân dữ liệu REST.

Lưu ý: Tôi biết dưới các vấn đề mở:

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

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

Trả lời

34

sử dụng JpaRepository được shadowing Danh sách < Sách > FindAll() phương pháp. Sau đó, tôi đã sử dụng CrudRepository và PostFilter đã được áp dụng.

Để biết thêm chi tiết, một dự án mẫu có sẵn trên GitHub: https://github.com/charybr/spring-data-rest-acl

uỷ quyền ACL dựa trên đang làm việc cho tổ chức dưới tiếp xúc bởi Spring liệu 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(); 
} 
+5

Bạn sẽ xứng đáng nhận được một (hoặc một năm rưỡi sau) để dành thời gian đến và đăng câu trả lời cho vấn đề của chính bạn. Cảm ơn bạn ! –

+0

Làm thế nào để lọc kết quả bằng cách sử dụng '@ PostAuthorize' trong một hàm' findAll() 'dựa trên các giá trị thực thể riêng lẻ bên trong mảng có thể đánh số trang? –

+0

@ W.M. cho pageable '@ PostAuthorize' không phải là một ý tưởng hay. Vui lòng tham khảo https://docs.spring.io/spring-security/site/docs/4.0.x/reference/htmlsingle/#data-query –

Các vấn đề liên quan