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ể ...
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. –
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. –