2011-04-27 41 views
3

我已經設置了Devise來管理我的應用程序的身份驗證。設計和當前用戶

我有一個類別模型,其中用戶創建自己的類別。用戶has_many:類別。此模型具有user_id屬性,因此,當某人登錄並轉到類別/索引時,查詢會使用current_user.id將類別過濾掉要帶入的類別。

到目前爲止,並且運作良好,似乎沒有人能夠看到別人的類別,但說實話,除非我錯過了某些東西,這似乎有點不安全。我怎麼知道一些黑客不知道併發送他自己的請求修改params?

這是可能或我是偏執​​?另外,我可能沒有正確使用功能?

+0

我不確定我是否確切知道你在哪些類別中引入。這是在控制器?視圖?假設您在用戶has_many:categories中使用關係,則可以使用current_user.categories和current_user.categories.build(在您的控制器中)。如果您可以舉例說明您的代碼在哪裏以及它的使用方式,那麼這可能會讓我們對安全性有更好的瞭解。它實際上聽起來像是在視圖內而不是控制器中爲當前用戶過濾,這對我來說似乎是一個壞主意。 – 2011-04-27 14:18:11

+0

編輯問題以解決您的意見。過濾確實發生在控制器上。有沒有辦法,以這種方式完成你可能會看到其他人的信息? – Lievcin 2011-04-27 14:30:12

回答

1

我認爲你有一個對一個(每個用戶一個類別)的關係設置,而不是一個一對多(每用戶許多類別)。如果User型號中有category_id,則應該進行以下設置。

# in User.rb 
belongs_to :category 

# in Category.rb 
has_many :users 

# in CategoriesController 
@category = current_user.category 

如果你想有每個用戶的多個類別,比我建議使用一個鏈接表(如模型UserCategory)與user_idcategory_id

# in UserCategory.rb 
belongs_to :user 
belongs_to :category 

# in User.rb 
has_many :user_categories 
has_many :categories, :through => :user_categories 

# in Category.rb 
has_many :user_categories 
has_many :users, :through => :user_categories 

然後,在你Category控制器,你可以用你的代碼從上面給定用戶抓住所有類別。

# in CategoriesController.rb 
@categories = current_user.categories 
2

只要你正在使用userscategories之間的正確關係,即

# in User.rb 
has_many :categories 

# in Category.rb 
belongs_to :user 

,你應該能夠使用這樣的事情在你的控制器:

@categories = current_user.categories 

這樣你使用當前用戶,而不管可以傳遞哪些參數,並且只會獲得他們的畫廊。您不再通過可能不安全的user_id進行搜索。

如果您擔心某人能夠查看不屬於他們的類別,您可以添加自己的類似於:authenticate_user!的私有方法,以確保顯示或編輯的類別實際上屬於當前用戶,在另一個before_filter中運行它,如果它們沒有權限,則重定向。

private 
    def authenticate_owner! 
    if user_signed_in? && current_user.id == params[:id] # or something similar 
     return true 
    end 
    redirect_to root_url, 
     :notice => "You must have permission to access this category." 
    return false 
    end 
+0

感謝您的建議。這不會阻止類別被列在我首先想到的位置。你覺得我的恐懼沒有根據嗎? (如果我沒有在設計上實現我自己的方法) – Lievcin 2011-04-27 14:42:32

+0

這取決於你想要訪問哪些類別。這些可以應用於您的任何控制器操作。如果您只希望查看者查看自己的類別,我會將current_user.categories用於您的索引或任何其他視圖。我包含的方法僅適用於我想要基於身份的訪問權限的內容,例如個人照片庫的show操作。 – 2011-04-27 14:52:30

+0

我個人不太瞭解會議如何在Devise中工作,也不足以說明您的代碼如何工作(或者應該保護什麼),以告訴您您的恐懼是否完全沒有根據。但是Devise只能讓用戶能夠登錄並且擁有身份的用戶會話,並且可以基於登錄來限制訪問。使用它,您必須實現自己的方法,以在用戶登錄後進一步限制訪問。(根據我的經驗,至少) – 2011-04-27 14:55:36

0

根據喬希的回答,我只是把它變成了if else語句。我將params[:id]轉換爲整數,因爲current_user.id返回1。

class UsersController < ApplicationController 
    before_filter :authenticate_owner! 
    #.... 
    private 
    def authenticate_owner! 
    if user_signed_in? && current_user.id == params[:id].to_i 
     return 
    else 
     redirect_to root_url, :notice => "You must have permission to access this page." 
    end 
    end 
end