В 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