Как ограничить доступ к моделям в Ruby on Rails 4 с помощью Pundit и Rolify

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

Моя цель состоит в том, чтобы реализовать некоторый детальный контроль над тем, какие роли/группы пользователей, сгенерированные из Rolify и контролируемые Pundit, имеют доступ к определенной категории, подкатегории или статье через консоль администратора Upmin. Категория/статья должна позволять более чем одной пользовательской роли/группе доступ к своему содержимому.

Ответ здесь демонстрирует определение роли для конкретного экземпляра модели, что хорошо, но Я также хотел бы иметь этот контроль из экземпляра модели через простую форму флажка в консоли администратора моего приложения (Upmin_admin для тех, кто заинтересован).

Я прав, думая, что для создания этой функциональности не так уж много, кроме создания частичного представления экземпляра категории/статьи в консоли администратора, в котором перечислены все роли/группы и их текущие настройки CRUD для этой конкретной категории/статьи. пример. Или я пропустил несколько промежуточных шагов?

Был бы очень признателен за толчок в правильном направлении. Спасибо!

Небольшая предыстория моего приложения:

В моем веб-приложении у меня есть вложенные ресурсы, категории, статьи и комментарии, например:

resources :categories do
  resources :articles do
    resources :microposts, only: [:new, :create, :edit, :destroy
  end
end

(Я знаю, что рекомендуется вкладывать ресурсы глубже одного уровня, однако я я только что вскочил на поезд Rails, и :shallow = true не дал результатов, которые я искал.)

Категории действуют как вложенные наборы, любезно предоставленные Awesome Nested Set, и могут «удерживать» как категории, так и статьи (и расширенные комментарии).

Пользователи аутентифицируются через сервер LDAP с помощью Devise — я буду настраивать это в ближайшем будущем, чтобы автоматически назначать пользователя правильной группе/роли.


person Darragh    schedule 17.02.2015    source источник


Ответы (1)


Перечитав документацию по Rolify, я пришел к началу решения своей проблемы.

Всякий раз, когда пользователь создает категорию, подкатегорию или статью, я запускаю

user.add_role :current_role Model.Instance_id

который я могу затем запросить с портала администрирования, получив идентификатор экземпляра. Затем, запрашивая все роли пользователей в системе и сравнивая их с ролями, связанными с экземплярами, я могу создать частичное представление для консоли администратора.

model_instance = Model.find(instance_id)
model_instance.roles #returns all of the roles associated with that instance

Мне также нужно было бы создать несколько методов для обработки (массового) назначения/переназначения ролей, чтобы при (отмене) выбора флажка был достигнут ожидаемый результат, например добавление роли/группы в экземпляр и наоборот . Вероятно, что-то вроде (псевдокод со вкусом рубина, которому нужно следовать!!)

users = User.with_any_role(:some_role)

def assignRoleToModel(model_instance, users, role)
  if model_instance.roles.empty?
    users.each { |u| u.add_role creatorRole model_instance }
  end
  flash[:warning] = "#{Model_instance.name} already has that role assigned to it!"
end

где model_instance — это экземпляр модели, к которой я хочу управлять доступом группы/роли, users — это список пользователей, у которых есть роль, которую я хочу добавить в model_instance, а role — это роль, которую я хочу разрешить доступ к model_instance.

Обновить

Пример управления ролями через форму https://github.com/RolifyCommunity/rolify/issues/246

person Darragh    schedule 18.02.2015