2014-05-13 12 views
8

Nếu tôi có thiết lập kho lưu trữ như sau, sử dụng REST dữ liệu Spring, tôi có thể truy cập dữ liệu tại/receipts và xem tất cả dữ liệu. Tuy nhiên, tôi chỉ muốn trả lại dữ liệu cho người dùng. Tôi có một công cụ tìm kiếm tùy chỉnh "findByStorer" sẽ thực hiện việc này. Làm thế nào tôi có thể lấy Spring Data REST để sử dụng điều này và nhận giá trị bộ nhớ của người dùng thay vì chỉ định tham số truy vấn?Dữ liệu Spring lọc dữ liệu REST dựa trên người dùng

@RepositoryRestResource(collectionResourceRel = "receipts", path = "receipts") 
public interface ReceiptRepository extends PagingAndSortingRepository<Receipt, BigDecimal> { 

    @Query 
    public Page<Receipt> findByStorer(String storer, Pageable pageable); 
} 

Tôi chưa thực hiện bất kỳ bảo mật nào, vì vậy câu hỏi này lý thuyết hơn tại thời điểm này hơn là thực hành.

Cảm ơn.

Trả lời

2

Nếu bạn sử dụng Xuân An, bạn có thể sử dụng phương pháp này:

@PreAuthorize("isFullyAuthenticated() && (#userName == principal.username)") 
public List<User> findByUserName(@Param("userName")String userName); 
+0

này không hoàn toàn giải thích làm thế nào để đi từ tên người dùng để các Storer, nếu ví dụ để tham gia bảng nhận cho người dùng bảng bạn cần phải đi qua bảng Storer. IE, một cái gì đó như 'chọn * từ người dùng, nhận nơi user.storer = receipt.storer'. – JBCP

3

Xây dựng về câu trả lời @ RPR của:

Bạn sẽ có thể tham khảo các thuộc tính của đối tượng tham gia (Storer). Trong ví dụ của bạn nếu bạn có Receipt -> Storer -> Người dùng bạn có thể truy vấn các biên nhận nơi Storer.user có một giá trị được tiêm từ Security Context.

@PreAuthorize("isFullyAuthenticated && (#userName==principal.username)") 
Page<Receipt> findByStorer_User(@Param("userName") String userName) 
+3

Làm thế nào chúng ta có thể làm cho phương thức findByStorer_User() này là mặc định, thay thế findAll() khi người dùng có quyền truy cập hạn chế sử dụng API? Chúng tôi muốn giữ findAll() cho người dùng quản trị và có phương thức hạn chế cho người dùng bị hạn chế. – Wouter

1

Ví dụ, cho một Repository cho SomeEntity bạn có thể ghi đè lên findAll phương pháp với một phong tục @Query lọc bởi thuộc tính owner với giá trị of` # {} principal.username

@RepositoryRestResource(path = "some-entities", collectionResourceRel = "some-entities", itemResourceRel = "some-entity") 
interface SomeEntityRepository extends PagingAndSortingRepository<SomeEntity, String> { 
    @Override 
    @RestResource(exported = true) 
    @Query("select someEntity from SomeEntity someEntity where someEntity.owner = ?#{principal.username}") 
    Iterable<SomeResource> findAll(); 
} 
0

Vấn đề này là một tipical mối quan tâm xuyên suốt nên tôi đã thử áp dụng AOP. Xác định Tư vấn và cập nhật các args (String Storer), như giải thích tại địa chỉ: https://stackoverflow.com/a/46353783/1203628

@Aspect 
@Transactional 
@Component 
public class FilterProjectsAspect { 

@Pointcut("execution(* com.xxx.ReceiptRepository.findByStorer(..))") 
    public void projectFindAll() { 
    } 

    @Around("projectFindAll()") 
    public Object filterProjectsByUser(final ProceedingJoinPoint pjp) throws Throwable { 

     Object[] args = pjp.getArgs(); 
     for (int i = 0; i < args.length; i++) { 
      if (args[i] instanceof String) { 
       String storer=(String) args[i]; 
       // Find storer by user 
       args[i]=storer; //Update args 
      } 
     return pjp.proceed(args); 
    } 

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