Rails отменяет авторизацию для моего сценария с участием суперадмина, администратора клиента, пользователей клиента

#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 (см. Пример выше)