【问题标题】:ActiveAdmin on a per-resource basis基于每个资源的 ActiveAdmin
【发布时间】:2019-07-19 12:48:37
【问题描述】:

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

但是,我似乎无法实现正确的授权,因为 ActiveAdmin 不允许 Resource 成为其自定义 AuthorizationAdapters 中的功能。也就是授权的主体?方法是 Rails 模型(如用户或捐赠)或 ActiveAdmin::Page 但不是 ActiveAdmin 资源。

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

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

我的生产环境目前有 ActiveAdmin 1.4.3 和 Rails 5.1。

【问题讨论】:

    标签: ruby-on-rails-5 activeadmin


    【解决方案1】:

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

    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,而不是级别或角色,因此我可以以细粒度的方式定义访问权限。将您的管理员检查方法的名称放在 before_action -> { ... } 中,忘记 AuthorizationAdapters,除非您需要检查不同模型操作的授权。

    【讨论】:

      猜你喜欢
      • 2013-10-16
      • 1970-01-01
      • 2012-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多