В rails4, имеющем много моделей, использующих камень cancancan, предоставить доступ конкретному пользователю только к конкретной модели?

У меня есть 5 моделей в моем приложении rails 4, и с помощью cancancan gem я хочу предоставить доступ конкретным пользователям только к конкретной модели.

Это означает:

  • Пользователь 1 имеет доступ к 1,2 модели

  • пользователю 2 разрешен доступ к модели 3,4

  • Пользователь 3 имеет доступ ко всем моделям.

Пожалуйста, ведите меня.

2 ответа

Решение

Более простая версия Mikeответ будет следующим:

#app/models/ability.rb
class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)
    case user.role_id
      when 1
         can :read, Model
         can :read, Model2
      when 2
         can :read, Model3
         can :read, Model4
      when 3 
         can, :manage, :all
    end
  end    
end

Вы должны будете добавить способ определить, является ли User является 1,2,3 и т.д., вот почему Mike предложенный rolify,

Вы должны использовать rolify с cancan для достижения этой цели. Вы можете назначить определенную роль с rolify, чтобы представлять вашего "пользователя 1" или "пользователя 2" следующим образом:

user = User.find(1)
user.add_role :limited_user_1

и ваш "пользователь 3", имеющий доступ ко всему, может быть администратором

user = User.find(3)
user.add_role :admin

Тогда с cancan это так же просто, как проверка, если user имеет указанный role, В этом случае :manage означает user имеет доступ ко всем действиям, таким как :read, :create, :update, :destroy,

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)
    if user.admin?
      can :manage, :all
    elsif user.limited_user_1?
      can :manage, :model_1
      can :manage, :model_2
    elsif user.limited_user_2?
      can :manage, :model_3
      can :manage, :model_4
    end
  end
end
Другие вопросы по тегам