【问题标题】:Using Pundit with namespace将 Pundit 与命名空间一起使用
【发布时间】:2014-01-21 10:09:30
【问题描述】:

在我的项目中,我有很常见的命名空间“admin”。

namespace :admin do
    resources :users, except: :show
end

我使用 Pundit gem 来设置正确的授权,但我发现很难与命名空间中的控制器一起使用。我的政策组织如下

-policies
    -admin
        user_policy.rb
    application_policy.rb
    admin_policy.rb
    awesome_policy.rb

与控制器非常相似。

但是,当我在控制器内部使用“授权”方法时,我只得到一个错误,通知该应用程序“无法找到 UserPolicy”。我的 UserPolicy 如下所示:

class Admin::UserPolicy < AdminPolicy
end

那么问题是什么,我应该怎么做才能让 Pundit 看到命名空间内的那些策略?

【问题讨论】:

    标签: ruby-on-rails pundit


    【解决方案1】:

    使用新合并的commit,您可以做到这一点。

    它会自动工作。

    更新:

    从 0.3 版本开始有效删除而不替换功能。但是命名空间功能可以在github的命名空间分支中获得。

    您可以在issue on github 中查看有关功能的讨论。

    我对想要使用名称空间的人的建议 - 不要使用。在过滤器之前进行过滤以访问管理仪表板等受限区域,并将授权模型规则保留在权威文件中。这样您就可以使用 pundit 而不会遇到任何问题。

    【讨论】:

    【解决方案2】:

    简短回答:您不能让 Pundit 使用控制器命名空间特定的策略。

    长答案:Pundit 会查看资源(模型)以确定要使用的 Policy 类,因此每当您将 User 模型的实例作为资源传递时,它都会寻找 UserPolicy,而不是Admin::UserPolicy

    请参阅hereherehere

    可以在您的 User 模型上指定 policy class,但这并不能真正解决您的命名空间控制器问题,因为 Pundit 将从模型中派生策略类,而不管您在哪里授权。

    【讨论】:

      【解决方案3】:

      虽然 onemanstartup 提到它现在应该自动工作,但我无法让命名空间策略工作,但这是我认为可以接受的。

      在您的情况下,在 AdminPolicy 中,我添加了自定义操作名称,例如

      def new_user?
        some code
      end
      

      然后在我的 Admin::UserController#new 操作中

      def new
        authorize @user, :new_user?
      end
      

      【讨论】:

      • 出色的工作!修复了一个我一直卡住的问题!做得好! @dminor
      【解决方案4】:

      因为同样的问题才来到这里。使用 pundit v2.1.0,这可以通过在控制器中覆盖 policy_scopeauthorize 来实现。我为类似的设置做了什么:

      module Admin
        class ModuleController < ModuleController
          private
      
          def policy_scope(scope)
            super([:admin, scope])
          end
      
          def authorize(record, query = nil)
            super([:admin, record], query)
          end
        end
      end
      

      然后只需使用通常的方式在控制器中处理您的策略,然后控制器将从您的 Admin 命名空间中获取策略。

      这也在自述文件https://github.com/varvet/pundit#policy-namespacing中进行了描述

      如果您需要比当前用户和记录更多的上下文,Pundit policies with two input parameters 会很有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-11
        • 2016-09-14
        • 2021-08-26
        • 2014-10-13
        • 2016-04-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多