如何阻止用户删除其他用户的帖子?
问题描述:
我有一项用户(我称之为我的应用程序提供者),我试图写一个自定义的验证方法,以防止提供商删除对方的帖子(在我的应用程序调用的过程)。现在我的程序控制器中有了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方法为f引入过程ID而不是提供者ID。我怎样才能解决这个问题?由于
答
验证是关于确保用户是他说的是谁。设计是一个授权库。它提供的唯一访问控制是您可以针对未知用户设置限制。
授权正在制定谁来做什么的规则。流行的图书馆包括Pundit & CanCanCan。
即使没有一个lib,你可以写这样一个简单的授权规则:
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在PARAMS其他欺骗攻击的PARAMS的ID。
但是,我不建议你从头开始编写授权解决方案,除非你真的知道你在做什么。
不是你问什么,但这似乎更像是一个比一个验证一个授权问题。宝石像'cancan'或'pundit'这样的东西都是关注的。 – elements