2012-02-29 39 views
6

Trong ứng dụng dựa trên Spring của tôi, tôi hiện có các vai trò cơ bản như ADMIN và USER.Đặt vai trò người dùng dựa trên một số loại quyền sở hữu trong Spring Security

Có thể xác định vai trò người dùng như PHOTO_UPLOADER, kế thừa từ USER, nhưng cũng thêm kiểm tra xem người dùng thực hiện cuộc gọi có thực sự là chủ sở hữu của ảnh không?

Tôi cảm thấy mệt mỏi khi viết lại cùng một lúc if (currentUser.id == photo.uploader.id) trong các hành động điều khiển của mình. Nó cũng áp dụng cho các thực thể khác.

Trả lời

0

Chào mừng bạn đến với thế giới của ACLs - danh sách kiểm soát truy cập. This hướng dẫn khá cũ nhưng khá toàn diện.

+0

Vâng, nó đã cũ vào năm 2012 vì vậy bây giờ vào năm 2017 tôi đoán nó là "siêu cũ". Có điều gì mới đối với ACL trong mùa xuân? Vẫn còn khó để bắt đầu với điều đó - hoặc là đã có một sự thay thế? – displayname

9

Bạn có thể xử lý nó bằng ACL như Tomasz Nurkiewicz đã đề xuất. Nhưng Spring Securitz ACLs phức tạp và kém tài liệu. (Tài nguyên tốt nhất tôi biết cho nó là Cuốn sách này: Spring Security 3 - bởi các tác giả của Spring Security)

Nhưng nếu bạn thực sự chỉ cần thử nghiệm đơn giản if (currentUser.id == photo.uploader.id), thì tôi sẽ giới thiệu một kỹ thuật khác.

Có thể tăng cường các biểu thức bảo mật của phương thức mà bạn có thể sử dụng chúng trong chú thích @PreAuthorize. Giống như:

@PreAuthorize("isPhotoOwner(#photo)") 
public void doSomething(final Photo photo) { 

Thực hiện như một biểu isPhotoOwner cốt lõi là thực sự đơn giản:

public class ExtendedMethodSecurityExpressionRoot extends MethodSecurityExpressionRoot { 

    public ExtendedMethodSecurityExpressionRoot(final Authentication a) { 
     super(a); 
    } 

    /** 
    * 
    */ 
    public boolean isPhotoOwner(final Photo photoObject) { 
     if (photoObject == null) { 
      return false; 
     } 

     Photo photo = (photo) photoObject; 
     return photo.getCreator().getLogin().equals(authentication.getName()); 
    } 
} 

Unfortunaly có một số công việc addtional để đăng ký ExtendedMethodSecurityExpressionRoot. --- Tôi không có thời gian vào lúc này, nếu bạn sẵn sàng thử phương pháp này, sau đó để lại cam kết và tôi sẽ mô tả phần còn lại

+1

Tôi thích điều đó – preslavrachev

1

Tôi không biết loại công nghệ truy cập dữ liệu nào sử dụng. tôi biết bạn có thể viết interceptor hoặc event listener để thực hiện kiểm tra bảo mật cho hibernate. tôi nghĩ ibatis cũng giống như vậy. trong dự án của tôi, tôi đã viết các phương thức giao diện cho phép CRUD trong lớp mô hình/thực thể cha mẹ và thực hiện kiểm tra bảo mật trong một số sự kiện, chẳng hạn như trước khi tải thực thể. mùa xuân an ninh acl là một chút phức tạp. triển khai giải pháp bảo mật của bạn tốt hơn.

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