如何阻止设计用户删除其他用户的帖子?
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 来伪装成其他人。
但是,除非您真的知道自己在做什么,否则我不建议您从头开始编写授权解决方案。
我有一个设计用户(我在我的应用程序中调用提供者),我正在尝试编写自定义身份验证方法以防止提供者删除彼此的帖子(在我的应用程序中称为过程)。现在我的程序控制器中有 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 来伪装成其他人。
但是,除非您真的知道自己在做什么,否则我不建议您从头开始编写授权解决方案。