2015-10-20 85 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

相關問題