2015-10-20 104 views
0

我有一项用户(我称之为我的应用程序提供者),我试图写一个自定义的验证方法,以防止提供商删除对方的帖子(在我的应用程序调用的过程)。现在我的程序控制器中有了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。我怎样才能解决这个问题?由于

+1

不是你问什么,但这似乎更像是一个比一个验证一个授权问题。宝石像'cancan'或'pundit'这样的东西都是关注的。 – elements

回答

0

验证是关于确保用户是他说的是谁。设计是一个授权库。它提供的唯一访问控制是您可以针对未知用户设置限制。

授权正在制定谁来做什么的规则。流行的图书馆包括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。

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

0

错误消息告诉你:

你的变量@procedure是,该方法correct_user被称为时间为零。

+0

这比回答的评论。 – max

相关问题