2015-02-21 12 views
6

Là chú thích mới đến mùa xuân, tôi cần làm rõ mã bên dưới.Cách thức @PostFilter và @PreFilter hoạt động

@PostFilter("hasPermission(filterObject, 'READ') or hasRole('ROLE_ADMIN')") 

    public List<User> getUsers(String orderByInsertionDate, 
      Integer numberDaysToLookBack) throws AppException 

; Vì vậy, điều này có nghĩa rằng danh sách người dùng được trả về bởi người dùng sẽ chỉ chứa những phần tử có đầy đủ quyền truy cập vào đối tượng gọi hoặc đối tượng gọi có vai trò là "ROLE_ADMIN". Cảm ơn.

Trả lời

11

@PreFilter@PostFilter được chỉ định để sử dụng với bảo mật mùa xuân để có thể lọc bộ sưu tập hoặc mảng dựa trên ủy quyền.

Để có làm việc này, bạn cần phải sử dụng kiểm soát truy cập biểu hiện dựa trên an ninh mùa xuân (như bạn có trong ví dụ của bạn)

@PreFilter - lọc bộ sưu tập hoặc mảng trước khi phương pháp thực hiện.

@PostFilter - lọc bộ sưu tập hoặc mảng được trả lại sau khi thực hiện phương pháp.

Vì vậy, giả sử bạn getUser() trả về Danh sách người dùng. Spring Security sẽ lặp qua danh sách và xóa bất kỳ phần tử nào mà biểu thức được áp dụng là sai (ví dụ: không phải là quản trị viên và không có quyền đọc)

filterObject là đối tượng tích hợp để thực hiện bộ lọc và bạn có thể áp dụng các điều kiện khác nhau để đối tượng này (về cơ bản tất cả các biểu thức built-in có sẵn ở đây, ví dụ như principal, authentication), ví dụ bạn có thể làm

@PostFilter ("filterObject.owner == authentication.name") 

Mặc dù những bộ lọc này rất hữu ích, nó thực sự không hiệu quả với các tập dữ liệu lớn, và về cơ bản bạn mất quyền kiểm soát kết quả của mình, thay vào đó, Spring kiểm soát kết quả.

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