Как я знаю, канкан и declarative_authorization, и я реализовал на основе ролей разрешения с обоими, я рекомендую канкан. Только мои два цента.
Пример (непроверенные, к сожалению, я не могу проверить здесь и у меня нет доступа к моему коду)
Так скажем, у нас есть структура вроде этого:
class User < ActiveRecord::Base
belongs_to :role
end
class Role < ActiveRecord::Base
has_many :users
# attributes: project_read, project_create, project_update
end
Тогда, канкан может выглядеть например:
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
Вы можете найти всю необходимую информацию в вики CanCan на github. Личная рекомендация следующего содержания:
В основном вам просто нужно расширить пример выше, чтобы включить свои роли через свои отношения. Чтобы это было просто, вы также можете создать дополнительные вспомогательные методы в ability.rb
.
Основное среднее предостережение может упасть (по крайней мере, я): Убедитесь, что пользователь может сделать что-то с моделью, прежде чем определить, что пользователь не может . В противном случае вы будете сидеть там разочарованы и подумать «но почему? Я никогда не писал, что пользователь не может». Да. Но вы также никогда явно не писал, что он может ...
В CanCan вы можете определить способности через блоки с условиями - https://github.com/ryanb/cancan/wiki/Defining-Abilities-with-Blocks. –
1. TeamMembers имеет много пользователей, ролей 2. Команды имеют много TeamMembers 3. В проекте есть одна команда ... С блоками указанная выше настройка не дает средств для фильтрации для конкретного экземпляра проекта. Если вы думаете, что это можно сделать ... Не могли бы вы предоставить мне, например. Заранее спасибо. –