如何阻止设计用户删除其他用户的帖子?

How to stop devise users from deleting other users posts?

我有一个设计用户(我在我的应用程序中调用提供者),我正在尝试编写自定义身份验证方法以防止提供者删除彼此的帖子(在我的应用程序中称为过程)。现在我的程序控制器中有 correct_user 方法。

def correct_user
  @provider = @procedure.provider.find(params[:id])
  redirect_to(provider_path(current_provider)) unless current_provider?(@provider)

结束

我在我的程序控制器中使用以下过滤器调用它:

before_filter :correct_user, :except => [:index, :show]

我在尝试编辑程序时遇到以下错误,甚至是提供商自己的程序:

NoMethodError (undefined method `provider' for nil:NilClass)
app/controllers/procedures_controller.rb:8:in `correct_user'
Parameters: {"id"=>"523"}

从这个错误的外观来看,correct_user 方法正在查找过程 ID 而不是提供程序 ID。我怎样才能解决这个问题?谢谢

错误消息告诉您:

在调用方法 correct_user 时,您的变量 @procedure 为 nil。

身份验证 是关于确保用户是他所说的那个人。 Devise 是一个授权库。它提供的唯一访问控制是您可以对未知用户进行操作限制。

授权 正在制定关于谁可以做什么的规则。热门图书馆包括 Pundit 和 CanCanCan。

即使没有库,您也可以像这样编写一个简单的授权规则:

class Provider < ActiveRecord::Base
  class NotAuthorized < StandardError; end
end

class ApplicationController < ActionController::Base

  rescue_from Provider::NotAuthorized, with: :deny_access

  private

    def deny_access
      render 'some_view', status: 403
    end
end

class ProceduresController < ApplicationController

  before_action :find_procedure, only: [:show, :edit, :update, :destroy]
  before_action :authorize_resource!, except: [:new, :index, :show]

  # DELETE /procedures/:id
  def destroy
    # This line never gets run if the user is not authorized.
    @procedure.destroy
  end

  private 

   def find_procedure
     @procedure = Procedure.find(params[:id])
   end

   def authorize_resource!
     unless current_provider == @procedure.provider
       raise Provider::NotAuthorized and return false
     end
   end
end

请注意,在 authorize_resource! 方法中,您将授权记录的用户 ID 与会话中的用户 ID 进行比较。

如果您使用了参数中的 ID,您就会让自己容易受到欺骗攻击,在这种攻击中,用户通过在参数中传递另一个用户的 ID 来伪装成其他人。

但是,除非您真的知道自己在做什么,否则我不建议您从头开始编写授权解决方案。