基于每个资源的ActiveAdmin

时间:2019-07-19 12:48:37

标签: ruby-on-rails-5 activeadmin

我现在真的很傻。我正在使用ActiveAdmin来控制我的NGO中的不同内容:成员,员工,捐赠等,每个都定义为ActiveAdmin资源(即具有不同视图,操作等的选项卡)。

但是,我似乎无法实现适当的授权,因为ActiveAdmin不允许资源成为其自定义AuthorizationAdapters中的功能。也就是说,授权的主题是什么?方法可以是Rails模型(例如“用户”或“捐赠”)或ActiveAdmin :: Page,但不能是ActiveAdmin资源。

实际上,使用ActiveAdmin :: Page进行授权要比没用要糟,因为无论有人试图访问成员,员工或捐赠,subject.name都将显示“仪表板”。同样,使用命名空间也不起作用,因为所有三个都分配给了:admin命名空间。我无法获得授权?告诉我该名称空间中控制器名称的方法,根据文档,该名称应为Admin :: StaffController或类似名称(知道控制器名称将解决此问题)。有些人可能会使用Rails模型进行授权,但是我的会员资源和我的职员资源都是基于用户模型的,他们只是提供了截然不同的管理体验,不同的操作,而且不同的人应该有权访问这些管理页面

真的没有办法基于Resource或Controller实现访问吗?在我们谈论某人是否应该能够删除用户之前很久,这似乎是限制访问网站区域的最常识的方法。

我的生产环境当前具有带有Rails 5.1的ActiveAdmin 1.4.3。

1 个答案:

答案 0 :(得分:0)

我解决了。现在,这是在我的员工资源中:

controller do
  before_action -> { require_privilege("administer_staff_in_country", "any") }

  def scoped_collection
    scope = UserPrivilege.get_scope_of_privilege(current_user, "administer_staff_in_country")
    if scope != "any"
      User.staff.where(country: scope)
    else
      User.staff
    end
  end

end

require_privilege是我已经在其他地方使用的方法-授权是基于特权(类似于Wordpress)完成的,而不是级别或角色,因此我可以以细粒度的方式定义访问。将您的admin-checking方法的名称放在before_action -> { ... }内,然后忽略AuthorizationAdapters,除非您需要检查不同模型操作的授权。