嵌套资源的 Pundit 无头策略
Pundit headless policy for nested resource
如何在没有基于另一个模型对象的模型的情况下从控制器授权操作?
假设我有一个名为 Server 的模型,我有一个名为 config_files_controller 的嵌套控制器,它没有对应的模型。
我希望能够根据服务器对象和当前用户以及为服务器定义的策略授权来自 config_files_controller 的操作。
在routes.rb我有:
resources :servers do
resources :config_files do
collection do
get 'load_file'
end
end
end
config_files_controller.rb 看起来像这样:
class ConfigFilesController < ApplicationController
before_filter :authenticate_user!
before_filter :load_server
def index
# displays file names
end
def load_file
# gets file content
end
private
def load_server
@server = Server.find(params[:server_id])
authorize :config_file, "#{action_name}?"
end
end
在configuration_file_policy.rb我想要这样的东西:
class ConfigurationFilePolicy < Struct.new(:user, :configuration_file, :server)
def index?
ServerPolicy.new(user, server).show?
end
def load_file?
ServerPolicy.new(user, server).update?
end
end
我可能遗漏了一些东西,或者我只是没有看到明显的解决方案。如有任何建议,我们将不胜感激!
谢谢!
您的控制器设置了 @server
对象,Server
似乎是一个模型。因此,授权就足够了。 (不需要 ConfigurationFilePolicy。)
config_files_controller.rb
...
def index
authorize @server, :show?
# displays file names
...
end
def load_file
authorize @server, :update?
# gets file content
...
end
如何在没有基于另一个模型对象的模型的情况下从控制器授权操作?
假设我有一个名为 Server 的模型,我有一个名为 config_files_controller 的嵌套控制器,它没有对应的模型。
我希望能够根据服务器对象和当前用户以及为服务器定义的策略授权来自 config_files_controller 的操作。
在routes.rb我有:
resources :servers do
resources :config_files do
collection do
get 'load_file'
end
end
end
config_files_controller.rb 看起来像这样:
class ConfigFilesController < ApplicationController
before_filter :authenticate_user!
before_filter :load_server
def index
# displays file names
end
def load_file
# gets file content
end
private
def load_server
@server = Server.find(params[:server_id])
authorize :config_file, "#{action_name}?"
end
end
在configuration_file_policy.rb我想要这样的东西:
class ConfigurationFilePolicy < Struct.new(:user, :configuration_file, :server)
def index?
ServerPolicy.new(user, server).show?
end
def load_file?
ServerPolicy.new(user, server).update?
end
end
我可能遗漏了一些东西,或者我只是没有看到明显的解决方案。如有任何建议,我们将不胜感激!
谢谢!
您的控制器设置了 @server
对象,Server
似乎是一个模型。因此,授权就足够了。 (不需要 ConfigurationFilePolicy。)
config_files_controller.rb
...
def index
authorize @server, :show?
# displays file names
...
end
def load_file
authorize @server, :update?
# gets file content
...
end