gpt4 book ai didi

ruby-on-rails - 获得 Pundit 授权使用 Namespaces on Rails 5

转载 作者:数据小太阳 更新时间:2023-10-29 07:35:30 30 4
gpt4 key购买 nike

关于获得 Rails 5 和 Pundit 授权使用命名空间的问题。

对于 Pundit,我想在 Controller 中使用 policy_scope([:admin, @car]它将使用位于以下位置的 Pundit 策略文件:app/policies/admin/car_policy.rb .我在尝试让 Pundit 使用此 namespace 时遇到问题 - 没有 namespace ,它工作正常。

应用程序正在运行:

  • rails 5
  • 认证设计
  • 授权专家

我的命名空间是 admins例如。

route.rb文件看起来像:

# config/routes.rb

devise_for :admins

root: 'cars#index'
resources :cars

namespace :admin do
root 'cars#index'
resources :cars
end

我设置了 Pundit ApplicationPolicy并让命名空间与 Pundit 的 authorize 一起工作方法:@record = record.is_a?(Array) ? record.last : record

# app/policies/application_policy.rb

class ApplicationPolicy
attr_reader :user, :record

def initialize(user, record)
@user = user
@record = record.is_a?(Array) ? record.last : record
end

def scope
Pundit.policy_scope!(user, record.class)
end

class Scope
attr_reader :user, :scope

def initialize(user, scope)
@user = user
@scope = scope
end

def resolve
scope
end
end
end

Admin::CarsController这有效 authorize [:admin, @cars]

class Admin::CarsController < Admin::BaseController
def index
@cars = Car.order(created_at: :desc)
authorize [:admin, @cars]
end

def show
@car = Car.find(params[:id])
authorize [:admin, @car]
end
end

但我想使用策略范围

class Admin::CarPolicy < ApplicationPolicy
class Scope < Scope
def resolve
if user?
scope.all
else
scope.where(published: true)
end
end
end

def update?
user.admin? or not post.published?
end
end

Admin::CarsController

class Admin::CarssController < Admin::BaseController
def index
# @cars = Car.order(created_at: :desc) without a policy scope
@cars = policy_scope([:admin, @cars]) # With policy scope / doesn't work because of array.
authorize [:admin, @cars]
end

def show
# @car = Car.find(params[:id]) without a policy scope
@car = policy_scope([:admin, @car]) # With policy scope / doesn't work because of array.
authorize [:admin, @car]
end
end

我收到一个错误,因为 Pundit 没有在寻找 Admin::CarPolicy .我猜这是因为它是一个数组。

我想在 Controller 中我可以做类似 policy_scope(Admin::Car) 的事情但这不起作用:)。

非常感谢任何助手。


更新

我在 Pundit Github 问题页面上找到了这个:https://github.com/elabs/pundit/pull/391

这修复了我想要的 policy_scope 的命名空间处理。

它更新了 Pudit gem -> policy_scope! lib/pundit.rb 中的方法.

来自:

def policy_scope!(user, scope)
PolicyFinder.new(scope).scope!.new(user, scope).resolve
end

收件人:

def policy_scope!(user, scope)
model = scope.is_a?(Array) ? scope.last : scope
PolicyFinder.new(scope).scope!.new(user, model).resolve
end

我的问题是,如何在我的 Rails 应用程序中使用它?是叫重载还是猴子补丁?

我在考虑添加 pundit.rbconfig/initializer目录和使用 module_eval但不确定如何做 policy_scope!在里面module Punditclass << self .

我认为这行得通,但行不通 - 假设是因为 policy_scope!在里面class << self .

Pundit::module_eval do
def policy_scope!(user, scope)
model = scope.is_a?(Array) ? scope.last : scope
PolicyFinder.new(scope).scope!.new(user, model).resolve
end
end

最佳答案

Medir 在 Pundit Github 问题页面上发布了解决方案。

只需将您的 application_policy.rb 更改为:

class ApplicationPolicy
index? show?....

class Scope
attr_reader :user, :scope

def initialize(user, scope)
@user = user
# @scope = scope
@scope = scope.is_a?(Array) ? scope.last : scope #This fixes the problem
end

def resolve
scope
end
end
end

然后你可以使用:

policy_scope([:admin, @cars])

关于ruby-on-rails - 获得 Pundit 授权使用 Namespaces on Rails 5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42454424/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com