Rails: мне нужны разные AdminUsers для разных разрешений - PullRequest
0 голосов
/ 29 сентября 2018

Итак, я пойду прямо к делу.

Я использую драгоценный камень ActiveAdmin, поэтому в моем приложении есть модель AdminUser ... Теперь я получилтребование от моего клиента, где «супер-администратор» должен иметь возможность контролировать разрешения других администраторов .

Так, например, если у меня есть ресурсы: Message, Client и Country, «супер администратор» должен быть в состоянии назначить AdminUser задачу управления сообщениями, другому задачу управления клиентами, а другому задачу управления странами.

Для этого я былподумывает о добавлении нескольких атрибутов boolean в таблицу admin_users.Например, атрибут boolean, называемый "super_admin", будет использоваться для определения, может ли этот AdminUser изменять разрешения других AdminUsers, другой атрибут, называемый message, будет использоваться для определения, имеет ли этот AdminUser контроль (можетредактировать, читать, удалять и т. д.) сообщений, другой атрибут, называемый страной, будет использоваться для определения, имеет ли этот AdminUser контроль (может редактировать, читать, удалять и т. д.) над странами и т. д. ...

В чем проблема? Я не могу access с current_admin_user в моделях, поэтому я не могу сделать что-то вроде этого:

ActiveAdmin.register Message do
  if (current_admin_user.message)
    permit_params Commune.attribute_names.map(&:to_sym)
  end
end

Так что я могуделать?Я должен построить эту функциональность!

1 Ответ

0 голосов
/ 29 сентября 2018

edit Я нашел этот драгоценный камень, который добавляет роли активному администратору https://github.com/yhirano55/active_admin_role

, почему он должен быть в модели?Код выглядит так, как будто его нужно поместить в контроллер, allow_params ...

Я бы использовал pundit .Я вижу, что банка может была обновлена ​​5 лет назад.Они похожи.

Pundit Repo: https://github.com/varvet/pundit

Он использует политики, поэтому вы создаете политику для каждой модели.

class PostPolicy < ApplicationPolicy
  def update?
    user.admin? or not record.published?
  end
end

, где вы можете проверить свои флаги наобновить или создать или показать или что-нибудь ...

В действии вы используете что-то вроде этого authorize @post,: update?

Цитата из их документа

В этом случае вы можете представить, что авторизация сделала бы что-то вроде этого:

unless PostPolicy.new(current_user, @post).update?
  raise Pundit::NotAuthorizedError, "not allowed to update? this #{@post.inspect}"
end

Надеюсь, это поможет

PS Если вам нужно более сложное решение.Я бы создал модель Role, в которой я мог бы указать модель, права на чтение и запись.Я бы связал его со своим пользователем с has_many ролями, и в моей политике сделайте что-то вроде этого:

class PostPolicy < ApplicationPolicy
  def get_role
    user.roles.where(model: "Post").first
  end
  def update?
    user.get_role.write? or not record.published?
  end
end

Или, может быть, есть лучший способ использовать его как-то в модели политики ...

...