2011-01-06 34 views
2

我剛剛開始Rails 3.我已經在名爲「Logs」的表上使用來自Rails 3的腳手架生成了以下代碼。限制url操作返回其他用戶記錄

下面的'index'函數僅提供與current_user.id(來自存儲在會話表中的會話)關聯的記錄。用戶記錄僅呈現以下的路徑登錄的用戶= 3(見下面的索引碼)

本地主機:3000 /原木

問題:作爲用戶,我可以查看記錄這不是通過手動編輯鏈接以顯示任何其他記錄我的記錄(即用戶= 3):

本地主機:5分之3000

「這是由user.id = 2輸入」 /日誌

尋求解決方案:如何防止手動黑客入侵以防止用戶查看其他用戶記錄?

類LogsController < ApplicationController的

的before_filter:login_required

def index 
    @logs = Log.where(:user_id => current_user) 
    respond_to do |format| 
    format.html # index.html.erb 
    format.xml { render :xml => @logs } 
end 

請忽略新的功能是從下面的創建功能缺失。下面的代碼是僅僅將演示如何把USER_ID進入「日誌」表

def create 
@log = Log.new(params[:log]) 
@log.user_id = current_user.id 
    respond_to do |format| 
    if @log.save 
    format.html { redirect_to(@log)} 
    format.xml { render :xml => @log, :status => :created, :location => @log } 
    else 
    format.html { render :action => "new" } 
    format.xml { render :xml => @log.errors, :status => :unprocessable_entity } 
    end 
end 

回答

4

最簡單的解決辦法是在表演方法來檢查日誌,顯示真正屬於登錄用戶:

def show 
    @log = Log.find(params[:id]) 
    unless @log.user_id == current_user.id 
    flash[:error] = "unauthorized" 
    redirect_to :index 
    end 
end 

但你很快就會有一些要限制訪問更多的東西,所以你應該尋找一個身份驗證插件,它允許以聲明的方式來定義訪問權限。也許這一個:https://github.com/be9/acl9

+0

非常感謝ACL的建議。認證與授權明顯不同。仍然處於我的初級階段,Rails和所有我似乎都在閱讀Ruby語法和Rails語法之間模糊的東西。我測試了你的代碼,它通過阻止url操作起作用。在操作url時,它只顯示用戶記錄。但是,我注意到閃存錯誤永遠不會發生。 – fresh 2011-01-06 13:04:44

相關問題