2012-01-06 4 views
15

Tôi cần tạo các hệ thống quyền dựa trên vai trò trong ứng dụng Rails của mình. Tôi sẽ hoàn toàn hài lòng với CanCan, nhưng vấn đề chính - nó phải năng động, vì vậy Admin phải có khả năng phân quyền và tạo ra các vai trò mới. Các điều khoản có thể là các hạn chế điều khiển/hành động đơn giản và có thể liên quan đến dữ liệu, ví dụ một số người dùng chỉ có thể chỉnh sửa tiểu sử của riêng họ và một số người trong số họ có thể chỉnh sửa tiểu sử của tất cả người dùng trong nhóm cụ thể. Và nó sẽ thực sự tốt đẹp để cho phép Admin tạo quyền mới.Vai trò động và hệ thống quyền trong ứng dụng Rails

Điều tôi đang nghĩ đến là lưu trữ trong db một bộ điều khiển/hành động và một số hạn chế liên quan đến dữ liệu (tôi thực sự nhầm lẫn ở đây về cách xác định chúng). Vì vậy, bạn có thể xin vui lòng cho tôi một số lời khuyên, những gì sẽ là cách tốt nhất để tổ chức các điều khoản?

Bất kỳ suy nghĩ được nhiều đánh giá cao

Trả lời

18

Nếu bạn thích CanCan, thì tôi nghĩ tốt nhất là nên sử dụng nó. Đây là một hướng dẫn ngắn về lưu trữ năng trong cơ sở dữ liệu để không phải lập trình có thể cập nhật chúng:

https://github.com/ryanb/cancan/wiki/Abilities-in-Database

Nếu bạn thực sự, thực sự muốn thực hiện hệ thống như vậy cho mình. Tùy thuộc vào nhu cầu của bạn, tôi sẽ đề nghị bạn thực hiện nó càng đơn giản càng tốt.

Trong trường hợp bạn chỉ cần người dùng có quyền truy cập vào các mô-đun (một số bộ điều khiển). Bạn có thể làm:

1) Lưu trữ tất cả các quyền người dùng trong lĩnh vực giống như serialized ->http://apidock.com/rails/ActiveRecord/Base/serialize/class

class User 
    serialize :permissions, Array 

    def access_to?(module) 
    permissions.include? module.to_s 
    end 
end 

một số kiểm tra khi thiết lĩnh vực này sẽ được tốt đẹp.

2) Chỉ cần chắc một tấm séc trên đầu trang của mỗi bộ điều khiển nếu người dùng hiện tại có thể sử dụng điều khiển này (phần)

class ApplicationController 
    private 

    def self.require_access_to(module) 
     before_filter do |c| 
     unless c.send(:current_user).try :access_to?(module) 
      c.send :render_no_presmissions_page 
     end 
     end 
    endposible 
end 

class AdminNewsController 
    require_access_to :news 
end 

Tất nhiên đây chỉ là một vị trí bắt đầu, từ nơi mà bạn có thể dễ dàng phát triển.

5

[EDIT Các liên kết đưa ra bởi @RadoslavStankov là một câu trả lời tốt hơn thế này.]

Bạn có thể làm điều đó với Cancan dễ dàng. Chỉ cần tạo mô hình cho các quyền (trong đó has_and_belongs_to_many :users) và trong số Ability#initialize tải các quyền phù hợp với người dùng từ mô hình và cho biết rằng người dùng can sẽ làm điều đó. Sau đó, tạo giao diện người dùng thích hợp để quản trị mô hình đó.

Something như thế này:

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new 
    user.permissions.each do |permission| 
     can permission.symbol, permission.scope 
    end 
    user.prohibitions.each do |permission| 
     cannot permission.symbol, permission.scope 
    end 
    end 
end 

nơi scope trở cái gì đó như :all cho nil phạm vi, hoặc Object.const_get(@scope_name) khác ... Chơi với nó. Dù sao, nó là doable.

Những điều phức tạp khác của CanCan có thể phức tạp hơn (duh) - ví dụ như có điều kiện - nhưng điều đó cũng là một bitch để quản lý, vì vậy tôi nghĩ điều này là đủ cho hầu hết các ứng dụng.