2012-01-18 22 views
7

Tôi đã xem declarative_authorization, CanCan và CanTango. Tất cả chúng đều tốt trong việc thêm ủy quyền vào ứng dụng nhưng tôi đã tự hỏi làm thế nào để thêm một ủy quyền cho cá thể cụ thể của một mô hình, tức là một người có thể có quyền truy cập quản lý trong một dự án và chỉ giới hạn (đọc ít hơn quản lý: cập nhật giới hạn, v.v.) trong một cái khác.Ủy quyền trong Rails 3.1: CanCan, CanTango, declarative_authorization?

Bạn có thể vui lòng một cách tốt hơn không? Xin lỗi nếu câu hỏi của tôi nghe có vẻ quá tầm thường. Có thể là do tôi mới làm quen với RoR.

cảm ơn, John

+0

Trong CanCan bạn có thể xác định khả năng thông qua các khối có điều kiện - https://github.com/ryanb/cancan/wiki/Defining-Abilities-with-Blocks. –

+0

1. TeamMembers có nhiều người dùng, vai trò 2. Đội có nhiều TeamMembers 3. Dự án có một đội ... Với khối, thiết lập ở trên không cung cấp phương tiện để lọc cho trường hợp cụ thể của dự án. Nếu bạn nghĩ rằng nó có thể được thực hiện ... Bạn có thể vui lòng cung cấp cho tôi một ví dụ Cảm ơn trước. –

Trả lời

4

Như tôi biết Cancan và declarative_authorization, và tôi thực hiện phép dựa trên vai trò với cả hai, tôi khuyên bạn nên Cancan. Chỉ cần hai xu của tôi.

Ví dụ (chưa được kiểm tra, tiếc là tôi không thể kiểm tra ở đây và tôi không có quyền truy cập vào mã của tôi)

Vì vậy, giả sử chúng ta có một cấu trúc như thế này:

class User < ActiveRecord::Base 
    belongs_to :role 
end 

class Role < ActiveRecord::Base 
    has_many :users 

    # attributes: project_read, project_create, project_update 
end 

Sau đó, Cancan có thể nhìn như thế này:

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    @user = user 
    @role = user.role 

    # user can see a project if he has project_read => true in his role 
    can :read, Project if role.project_read? 

    # same, but with create 
    can :create, Project if role.project_create? 

    # can do everything with projects if he is an admin 
    can :manage, Project if user.admin? 
    end 

end 

Bạn có thể tìm thấy tất cả thông tin bạn cần trong wiki của CanCan trên github. Đề nghị cá nhân để đọc:

Về cơ bản, bạn chỉ cần mở rộng ví dụ trên để bao gồm vai trò của bạn thông qua các mối quan hệ của bạn. Để đơn giản, bạn cũng có thể tạo các phương thức trợ giúp bổ sung trong ability.rb.

Thông báo trước có nghĩa là chính bạn có thể rơi cho (ít nhất tôi làm): Đảm bảo người dùng của bạn có thể làm điều gì đó với một mô hình trước khi bạn xác định những gì người dùng không thể. Nếu không bạn sẽ ngồi đó thất vọng và nghĩ "nhưng tại sao? Tôi không bao giờ viết người dùng không thể." Ừ. Nhưng bạn cũng không bao giờ rõ ràng đã viết rằng ông có thể ...

+0

Tôi đã thực hiện cancan .. nhưng không thể tìm ra cách để xác định/hạn chế người dùng cho một cá thể cụ thể (của dự án nói). Bất kỳ ví dụ nào sẽ thực sự hữu ích. Có kết nối gián tiếp giữa Người dùng và Dự án ... 1. TeamMembers có nhiều Người dùng 2. Các đội có nhiều TeamMembers 3. Dự án có một Đội –

+0

được cập nhật với một ví dụ. – pduersteler

+0

Tôi có cần cài đặt cancan và tạo mô hình vai trò không? Tôi không thấy trong tài liệu cancan rằng nó là cần thiết. Bạn có thể giải thích điều này không? thanks –

0
class User < ActiveRecord::Base 

    belongs_to :role 
    delegate :permissions, :to => :role 

    def method_missing(method_id, *args) 
    if match = matches_dynamic_role_check?(method_id) 
     tokenize_roles(match.captures.first).each do |check| 
     return true if role.name.downcase == check 
     end 
     return false 
    elsif match = matches_dynamic_perm_check?(method_id) 
     return true if permissions.find_by_name(match.captures.first) 
    else 
     super 
    end 
    end 


    private 

    def matches_dynamic_perm_check?(method_id) 
    /^can_([a-zA-Z]\w*)\?$/.match(method_id.to_s) 
    end 

    def matches_dynamic_role_check?(method_id) 
    /^is_an?_([a-zA-Z]\w*)\?$/.match(method_id.to_s) 
    end 

    def tokenize_roles(string_to_split) 
    string_to_split.split(/_or_/) 
    end 

end 

Cách sử dụng:

user.is_an? quản trị

user.can_delete?

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