#ruby-on-rails #authorization #cancan
#ruby-on-rails #авторизация #cancan
Вопрос:
Я новичок в ROR. У меня есть следующие роли и их действия в моем проекте
Суперадмин [это я]
-> Может управлять всеми
Clientadmin [пользователь-администратор для каждого клиента]
-> может управлять пользователем, пользователями своей организации
-> может управлять клиентскими данными, созданными пользователями его организации
Clientuser [пользователь, который может создавать, обновлять свои собственные данные]
-> может читать данные, созданные пользователями его организации [клиент]
-> может создавать данные
-> может обновлять данные, созданные им
Модели
Данные
пользователя
клиента
Ассоциация
Клиент имеет множество: пользователей
Пользователь принадлежит к: у
пользователя есть много данных
Данные принадлежат кому:пользователям
Проблема:
Я использовал devise для аутентификации. И пытаюсь использовать CanCan для авторизации. Необходимо авторизовать суперадмина для управления всеми, и могу ли я указать, что «этот пользователь может видеть только данные, созданные пользователями его организации», если да, то как.
Будет более полезно, если вы поможете мне с примером кода.
Спасибо,
KGK
Ответ №1:
На вики-странице «Определение способностей» есть несколько хороших примеров.
https://github.com/ryanb/cancan/wiki/defining-abilities
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new # guest user (not logged in)
if user.admin?
can :manage, :all
elsif user.clientadmin?
can :manage, User, :client_id => user.client_id
can :manage, Data, :client_id => user.client_id
end
end
end
Комментарии:
1. Я просмотрел эту статью. Моя проблема в том, что каждый пользователь будет связан с client_id, и в случае суперадмина, что я должен сделать для client_id. и как я должен фильтровать данные, созданные пользователями организации current_user [client], использующими cancan. Как мне отключить предыдущий фильтр для суперадмина.
2. Вы можете применить условия к способности, подобные этому:
can :manage, User, :client_id => user.client_id
(см. Пример выше)