2017-07-12 20 views
5

Chúng tôi đang sử dụng spring and spring-security-3.2. Gần đây, chúng tôi đang thêm chú thích @PreAuthorize vào RestAPIs (trước đó là URL).Thông báo lỗi tùy chỉnh với @Preauthorize và @@ ControllerAdvice

 @PreAuthorize("hasPermission('salesorder','ViewSalesOrder')") 
    @RequestMapping(value = "/restapi/salesorders/", method = RequestMethod.GET) 
    public ModelAndView getSalesOrders(){} 

Chúng tôi đã xử lý ngoại lệ toàn cục có chú thích - @ControllerAdvice và PermissionEvaluator tùy chỉnh tại chỗ, mọi thứ hoạt động tốt ngoại trừ thông báo lỗi. Cho phép một số người dùng đang truy cập API vào thời điểm này mà không có quyền 'ViewSalesOrder' sau đó theo mặc định, ném ngoại lệ 'Truy cập bị từ chối', nhưng không cho biết quyền nào bị thiếu (Yêu cầu của chúng tôi đề cập đến quyền nào là còn thiếu).

Có thể ném ngoại lệ cũng bao gồm tên quyền, vì vậy thông báo lỗi cuối cùng phải giống như "Truy cập bị từ chối, bạn cần quyền ViewSalesOrder" (tên quyền ở đây phải từ chú thích @PreAuthorize)?

Xin lưu ý rằng chúng tôi có 100 restAPI như vậy để giải pháp chung sẽ được đánh giá cao.

Trả lời

0

Không có cách nào tốt đẹp để đạt được những gì bạn mong đợi vì giao diện PermissionEvaluator không cho phép bạn chuyển quyền thiếu cùng với kết quả đánh giá.
Ngoài ra, AccessDecisionManager quyết định về ủy quyền cuối cùng đối với phiếu bầu của AccessDecisionVoter trường hợp, một trong số đó là PreInvocationAuthorizationAdviceVoter phiếu bầu đối với đánh giá giá trị @PreAuthorize.

Câu chuyện dài ngắn, PreInvocationAuthorizationAdviceVoter phiếu chống lại yêu cầu (đưa ra yêu cầu –1 điểm) khi tùy chỉnh PermissionEvaluator trả về false đến hasPermission cuộc gọi. Như bạn thấy không có cách nào để truyền bá nguyên nhân của sự thất bại trong luồng này.

Mặt khác, bạn có thể thử một số cách giải quyết để đạt được những gì bạn muốn.

Một cách có thể là để ném một ngoại lệ trong tùy chỉnh PermissionEvaluator của bạn khi kiểm tra quyền không thành công. Bạn có thể sử dụng ngoại lệ này để truyền bá quyền thiếu cho trình xử lý ngoại lệ toàn cục của bạn. Ở đó, bạn có thể chuyển quyền thiếu cho các mô tả thư của bạn dưới dạng thông số. Cẩn thận rằng điều này sẽ tạm dừng quá trình thực hiện AccessDecisionManager có nghĩa là cử tri kế tiếp sẽ không được thực thi (mặc định là RoleVoterAuthenticatedVoter). Bạn nên cẩn thận nếu bạn chọn để đi xuống con đường này.

Một cách an toàn hơn nhưng vụng về khác có thể thực hiện tùy chỉnh AccessDeniedHandler và tùy chỉnh thông báo lỗi trước khi trả lời 403. AccessDeniedHandler cung cấp cho bạn HttpServletRequest hiện tại có thể được sử dụng để truy xuất URI yêu cầu. Tuy nhiên, tin xấu trong trường hợp này là, bạn cần một URI để ánh xạ quyền để xác định quyền hạn bị thiếu.

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