2009-12-17 37 views
6

Tôi muốn sử dụng Bảo mật mùa xuân để quản lý người dùng, nhóm và quyền.Nhóm và acl trên Spring Security

Tôi muốn sử dụng ACL để bảo vệ đối tượng miền của mình nhưng tôi không thể tìm cách chỉ định nhóm cho acl.

Ví dụ: Tôi có người dùng và nhóm. Mỗi nhóm có thể có các chứng khoán sau: - quản lý diễn đàn (có thể là một vai trò như ROLE_FORUM_MANAGER) - chỉnh sửa một diễn đàn cụ thể (acl trên diễn đàn cụ thể).

Hơn nữa, Nhóm được xác định bởi người dùng có vai trò ROLE_PERMISSION_MANAGER. NHƯNG tất cả các nhóm được xác định bởi người dùng này chỉ có thể được chỉnh sửa và quản lý bởi người dùng này. Vì vậy, nhóm được đính kèm với người dùng. Chính xác, hãy tưởng tượng rằng người dùng tạo nhóm google: người dùng này chỉ có thể quản lý nhóm quyền phù hợp cho nhóm mà anh ấy đã tạo. Và do đó, anh ấy có thể tạo nhóm để quản lý diễn đàn cụ thể của nhóm google của riêng mình.

Tôi có thể làm như thế nào?

Tôi đọc các tài liệu an ninh mùa xuân và các hướng dẫn sau đây (vì vậy xin đừng gửi cho tôi những liên kết): http://grzegorzborkowski.blogspot.com/2008/10/spring-security-acl-very-basic-tutorial.html http://blog.denksoft.com/?page_id=20

Trả lời

14

Kiểm tra Spring Security 3.0, bạn có thể tránh sử dụng ACL ở tất cả bằng cách sử dụng Ngôn ngữ biểu thức mùa xuân.

Ví dụ, để chỉnh sửa một diễn đàn, bạn sẽ có một phương pháp bảo đảm như thế này:

@PreAuthorize("hasRole('ROLE_FORUM_MANAGER') and hasPermission(#forum,'update')) 
public void updateForum(Forum forum) { 
    //some implementation 
} 

Sau đó, bạn sẽ thực hiện các phương pháp hasPermission trong một đánh giá cho phép tùy chỉnh, như:

public class ForumPermissionEvaluator implements PermissionEvaluator { 

    public boolean hasPermission(Authentication authentication, 
      Object domainObject, Object permission) { 
     //implement 
    } 

    public boolean hasPermission(Authentication authentication, 
      Serializable targetId, String targetType, Object permission) { 
     //implement 
    } 
} 

Cuối cùng, kết nối nó với nhau trong cấu hình ứng dụng:

<beans:bean id="expressionHandler" 
    class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler"> 
    <beans:property name="permissionEvaluator" ref="permissionEvaluator"/> 
</beans:bean> 

<beans:bean id="permissionEvaluator" 
    class="com.centrix.core.security.GroupPermissionEvaluator" /> 
+0

vâng tôi đã nhìn thấy nó trước đây, nhưng như mùa xuân an ninh 3 không phải là một bản phát hành chính thức, tôi sẽ không sử dụng nó, nhưng tôi nghĩ rằng tôi sẽ chờ đợi một chút để sử dụng nó. –

+0

Để làm điều này bằng cách sử dụng các đối số phương thức như "#forum", bạn phải có thông tin gỡ lỗi còn lại trong các tệp JAR sản xuất của bạn .... có lẽ không phải là một ý tưởng hay. – HDave

+0

Trong phần nối dây, phần tử cuối cùng có phải là 'ForumPermissionEvaluator' thay vì' GroupPermissionEvaluator'? Một câu hỏi khác: nếu bạn muốn có nhiều hơn một PermissionEvaluator, làm thế nào mà sẽ được dây lên, vì chỉ có một expressionHandler? –

1

tôi đã làm một cái gì đó tương tự như 'bằng tay': tức là tôi đã mã riêng của tôi để xác định những trường hợp nào có thể được chỉnh sửa/xóa bởi một người dùng cụ thể và chỉ dựa vào bảo mật mùa xuân để đảm bảo họ có vai trò đúng để truy cập chức năng và cung cấp thông tin vai trò/xác thực cho người dùng hiện tại.

Vì vậy, trong mã của tôi, tôi đã xác định hiệu trưởng hiện tại (lớp người dùng riêng của chúng tôi) và dựa trên đó tôi đã quyết định quyền của người dùng này đối với một cá thể cụ thể.

public static User getCurrentUser() { 
    User user = null; 
    Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 
    if (auth != null) { 
     Object principal = auth.getPrincipal(); 
     if (principal instanceof User) { 
      user = (User)principal; 
     } 
    } 
    return user; 
} 
+0

Nhưng tôi không hiểu cách bạn áp dụng một acl cho một nhóm trong trường hợp của bạn? –

+0

Tôi không thực sự sử dụng một acl, nhưng nhóm và người dùng là cả hai thực thể và có một (hai chiều) quan hệ (được quản lý bởi ngủ đông). Để xác định liệu người dùng có thể thực hiện các hành động đặc biệt trên một nhóm hay không, tôi kiểm tra xem hiệu trưởng hiện tại có phải là người kiểm duyệt của nhóm đó hay không (tức là nhóm được chứa trong bộ sưu tập 'moderates' của người dùng). Vì vậy, danh sách người kiểm duyệt của mỗi nhóm về cơ bản là 'ACL' cho nhóm đó và được quản lý trong cơ sở dữ liệu, không phải trong cấu hình bảo mật mùa xuân. –

2

Tôi chỉ sử dụng Nhóm của bạn như Vai trò. Tôi đã tìm thấy việc triển khai Spring ACL khá khó sử dụng và phần lớn không sử dụng được. Chỉ cần gán người dùng cho "nhóm" (Vai trò trong tất cả thực tế) và kiểm tra chúng như bạn sẽ ủy quyền dựa trên vai trò bình thường.

+0

Vì vậy, tôi có thể tự động tạo ra một cơ quan như "GROUP_15" và sau đó, thêm vào diễn đàn 75 acl với GrantedAuthoritySid ("GROUP_15"). Nếu tôi có thể làm điều đó, Điều đó tốt cho tôi. Nhưng tôi cần phải tạo tất cả các vai trò và quyền động. –

+0

Bạn có thể làm điều đó, nhưng không phải với chú thích mùa xuân, ít nhất là ra khỏi hộp. "ROLE" bạn sử dụng trong chú thích được mã hóa cứng và không động. Tôi sẽ đề nghị viết MethodInterceptor của riêng bạn và đi từ của họ - đó là một giao diện đơn giản và không mất nhiều mã. – Gandalf

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