2010-07-06 29 views
5

Chúng tôi đang phát triển một ứng dụng (sử dụng Grails Spring Security (trước đây là Acegi)), trong đó chúng tôi sẽ có hàng ngàn người dùng trải rộng 10-15 loại người dùng kín đáo. Trong hệ thống hiện tại, mỗi loại người dùng tương đương với một "nhóm", và các vai trò và quyền cụ thể được gắn với nhóm. Người dùng nhận được tất cả "vai trò" của họ từ nhóm.Spring Security (Acegi) và Nhóm người dùng (so với vai trò)

Ví dụ, chúng ta có thể có hai nhóm người dùng:

CLOWN: vai trò = ride_clown_car, toot_horn, receive_applause ACROBAT: vai trò = do_flip, walk_tightrope, receive_applause

Chúng tôi có ba người, một giao cho Nhóm CLOWN, một nhóm được gán cho nhóm ACROBAT và một nhóm được gán cho cả hai (có sự kết hợp giữa các vai trò CLOWN và ACROBAT).

Nếu chúng tôi thay đổi quyền, chúng tôi sẽ làm như vậy ở cấp nhóm. Ví dụ, nếu chúng ta thêm quyền swing_on_trapeze vào nhóm ACROBAT, tất cả các nhào lộn sẽ tự động kế thừa nó.

Trong điều khoản Grails, quyền trên bộ điều khiển sẽ vẫn ở cấp vai trò. Vì vậy, một hành động với @Secured (['toot_horn']) sẽ cho phép người dùng trong nhóm CLOWN nhưng không cho phép trong nhóm ACROBAT. @Secured (['receive_applause']) sẽ cho phép cả CLOWNS và ACROBATS.

Làm cách nào để thực hiện điều này trong Spring Security vì bản chất hai tầng của mô hình (người dùng, vai trò)? Tôi có cần triển khai xác thực tùy chỉnh của riêng mình để thu thập vai trò dựa trên các nhóm không?

Cảm ơn!

+0

Tôi đang thực hiện một cái gì đó rất giống với của bạn. Làm thế nào để bạn thiết lập "grails.plugin.springsecurity.userLookup.authorityJoinClassName" trong trường hợp của bạn? Trong một hệ thống hai cấp, điều này chỉ có thể trỏ đến cấp độ đầu tiên (nhóm người dùng) mà không xác định vai trò/quyền hạn thực tế. – sola

Trả lời

7

Bạn nên sử dụng Spring Security Core plugin mới vì plugin Acegi không được phát triển và về cơ bản không còn được dùng nữa.

Tuy nhiên, cả hai trình cắm đều chỉ mong đợi có một phương thức như phương pháp getAuthorities() trong lớp người dùng của bạn trả về các phiên bản vai trò. Trong một kịch bản như thế này mà người dùng có nhiều nhóm, chỉ cần thu thập tất cả các vai trò của các nhóm:

class User { 
    ... 
    def getAllRoles() { 
     Set allRoles = [] 
     groups.each { allRoles.addAll it.roles } 
     allRoles 
    } 
} 

này giả định rằng bạn có một nhiều-nhiều giữa người dùng và Nhóm:

static hasMany = [groups: Group] 

Tập đoàn có nhiều-nhiều với Vai trò:

static hasMany = [roles: Role] 

để sử dụng thiết lập thuộc tính 'relationalAuthorities' thành 'allRoles' trong SecurityConfig.groovy nên nó sử dụng mà thay vào đó trong nhiều-nhiều giữa người dùng và vai trò:

relationalAuthorities='allRoles' 

Không có cấu hình cần thiết cho các plugin lõi Xuân An vì nó phụ thuộc vào một phương pháp getAuthorities ứng dụng xác định đã có, vì vậy chỉ cần sử dụng một cái gì đó như thế này trong lớp người dùng của bạn:

Set<Role> getAuthorities() { 
    Set allRoles = [] 
    groups.each { allRoles.addAll it.roles } 
    allRoles 
} 
+0

Ah- nó đã không xảy ra với tôi rằng Spring Security không truy cập trực tiếp Roles - chỉ thông qua phương thức aggregator trên User. Cảm ơn bạn đã đăng giải pháp đơn giản, thanh lịch này nhanh chóng! Cảm kích điều đó. Và cảm ơn tất cả công việc của bạn về chính plugin đó! – ecodan

+0

@Burt: Tôi đang triển khai một cái gì đó rất giống với ecodan. Làm cách nào để thay đổi "grails.plugin.springsecurity.userLookup.authorityJoinClassName" trong trường hợp này? – sola

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