2012-06-24 32 views
2

他們的個人資料我已經當前設定的我的應用程序,以便在應用中的成功的標誌在localhost:3000/users/id用戶他們的個人資料重定向但是如果我是第一個用戶id => 1並鍵入users/2我已經完全進入此配置文件。我一直在試圖找到如何使用設計來阻止這種情況。我很新的軌道,所以我敢肯定我錯過了一些簡單的東西,我已經使用了before_filter :authenticate_user!,但這顯然只是檢查用戶是否登錄,但不限制訪問其他用戶的配置文件。我看了一下CanCan,但這似乎有點矯枉過正,我試圖實現。任何指針非常讚賞。限制用戶只能訪問使用設計

users_controller.rb

class UsersController < ApplicationController 
    before_filter :authenticate_user! 
    before_filter :user_authorization 

    def index 
    @users = User.all 
    end 

    def show 

    @user = User.find(current_user[:id]) 

    end 


    private 

    def user_authorization 
     redirect_to(root_url) unless current_user.id == params[:id] 
    end 
end 

這正在從服務器報告:

Started GET "https://stackoverflow.com/users/2" for 127.0.0.1 at 2012-06-24 13:00:38 +0200 
Processing by UsersController#show as HTML 
    Parameters: {"id"=>"2"} 
    User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = 2 LIMIT 1 
    User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 2]] 
Redirected to http://localhost:3000/ 
Filter chain halted as :user_authorization rendered or redirected 
Completed 302 Found in 20ms (ActiveRecord: 0.8ms) 
+1

使用current_user方法。請參閱文檔 – vlain

回答

2

在一般情況下,我會說有兩種方法來解決這樣的問題:

  1. 滾動您自己的代碼並在您的控制器(或可能在您的模型類中)中執行檢查,並且
  2. 使用爲您執行規則的gem。

如果你想角色你自己的,最簡單的方法是簡單地把在檢查你的控制器,可以確保他們重定向,如果他們嘗試看看的配置文件是不是他們的。使用before過濾器做到這一點的一種方式是,儘管你想調整它適合你的應用程序的行爲。

before_filter :validate_user 
    def validate_user 
    redirect_to home_path unless current_user and current_user.id == params[:id] 
    end 

如果你想使用寶石,那麼我會推薦像你剛纔提到的康康或另一個寶石稱爲使命作爲租客。我已經看到它用於類似的事情。但是,如果您只想鎖定用戶配置文件,那麼向控制器添加代碼可能工作正常。

1

,瞧:

before_filter :user_authorization 

    private 

    def user_authorization 
     redirect_to(root_url) unless current_user.id == params[:id] 
    end 

CURRENT_USER是包含當前登錄用戶的幫手。

+0

謝謝,但這是行不通的我已經在users_controller和application_controller中試過了,既沒有阻止我查看其他配置文件? – Tom

+0

固定,錯過重定向 – vlain

+0

感謝,但這似乎現在重新回到所有'/用戶/ ID'的根路徑。我已經在上面添加了我的代碼,以查看是否有錯誤的設置。 – Tom

3

在你的控制器:

class UsersController < ApplicationController 
    before_filter :validate_user, :only => :show 

    def show 
    @user = User.find(params[:id] 
    end 


    def validate_user 
    redirect_to courses_path unless current_user.id.to_s == params[:id] 
    end 

end 

通知自current_user.id的current_user.id.to_s是一個整數,而params [:ID]是一個字符串。

+0

感謝.to_s! – tomd