2010-05-30 66 views
0

嘿傢伙我有一個應用程序控制器中的過濾器安裝前的Rails應用程序的紅寶石,以確保只有所有者可以編輯文檔,但我的權限檢查總是失敗,即使它不應該。以下是代碼:過濾器沒有按預期工作

def get_logged_in_user 
    id = session[:user_id] 
    unless id.nil? 
    @current_user = User.find(id) 
    end 
end 

def require_login 
    get_logged_in_user 
    if @current_user.nil? 
    session[:original_uri] = request.request_uri 
    flash[:notice] = "You must login first." 
    redirect_to login 
    end 
end 

def check_current_user_permission 
    require_login 
    logger.debug "user id is #{params[:user_id]}" 
    logger.debug "current user id is #{session[:user_id]}" 
    if session[:user_id] != params[:user_id] 
    flash[:notice] = "You don't have permission to do that." 
    redirect_to :controller => 'home' 
    end 
end 

要注意的代碼位於check_current_user_permission中。這裏是我的日誌輸出的一個例子:

user id is 3 
current user id is 3 
Redirected to http://localhost:3000/home 
Filter chain halted as [:check_current_user_permission] rendered_or_redirected. 

任何人都可以闡明爲什麼這是失敗?很顯然,3的user_id等於會話的user_id爲3.發生了什麼問題?

+0

只是好奇......你使用authlogic認證的東西? – DJTripleThreat 2010-05-30 02:16:08

+0

另外,如果session [:user_id]是'3'而params [:user_id]是'3'並且它們不相等,也許你應該先.to_s他們?我只是這樣說,因爲我有這個問題,我有兩個DateTime對象,當你.to_s他們是平等的,但由於某種原因,不計算相等,因爲不知何故,他們是第二個不同的一小部分。 – DJTripleThreat 2010-05-30 02:20:06

+0

我會嘗試DJTripleThreat ...另外我沒有使用任何寶石進行身份驗證 – Jimmy 2010-05-30 02:24:57

回答

2

如果session[:user_id]是'3'而params[:user_id]是'3'並且他們不相等,也許你應該先把它們放到第一位?

我只說這是因爲我有這個問題,我有兩個DateTime對象,當你.to_s他們他們是平等的,但由於某種原因,不計算相等,因爲不知何故,他們是第二個不同的一小部分。

Ruby是一種很棒的語言,但是一個缺點就是弱類型的特性..它是一把雙刃劍,因爲弱類型的特性允許一些很酷的東西。

很高興幫助!

+0

我想說這將是更好的轉換爲一個整數,而不是一個字符串。 – alternative 2010-05-30 21:29:13

+0

@〜mthepic,我同意......我習慣使用強類型語言,因此轉換爲字符串通常更容易。 Ruby中不是這樣。我將編輯我的帖子。 – DJTripleThreat 2010-05-31 17:00:38