2014-10-04 58 views
0

目前,我user_ID的存儲在一個會話:存儲參數的正確方法?

session[:user_id] = user.id 

後來,我檢索數據,當用戶點擊一個特定的外部鏈接,並將其保存到數據庫中。

def offer_params 
    params.permit(:offer_id).merge(user_id: session[:user_id]) 
end 

這是在多個視圖中存儲參數的正確方法嗎?這是否由用戶更改保存?

而且:還有其他方法可以做到這一點嗎?

回答

2

這絕對有效,但你可以改進它。 user_id不是您想直接授予用戶控制權的內容。特別是如果你的應用程序是新的,並且你的用戶ID是連續的,那麼對於有人操縱這個號碼並查看其他帳戶將是非常容易的。

一種解決方法是在名爲「token」的用戶記錄中創建一個字符串字段。以及在該字段中添加索引。

class AddTokenToUsers < ActiveRecord::Migration 
    def change 
    add_column :users, :token, :string 
    add_index :users, :token 
    end 
end 

當您創建新用戶時,爲他們生成一個長的隨機標記。

require 'digest/md5' 

class User < ActiveRecord::Base 
    before_create :generate_token 

    # your other code here... 

    private 

    def generate_token 
    self.token = Digest::MD5.hexdigest(username + rand.to_s) 
    end 
end 

該令牌將是一個32個字符的隨機十六進制字符串。對於這樣的事情,MD5散列算法非常快速,並且散列用戶名和隨機值使得幾乎不可能猜測某人的令牌。

然後,您可以直接在會話中存儲令牌,而不是直接存儲user_id,並且猜測隨機令牌的難度會更大。您可以通過定期更新令牌來更進一步。但是,大多數身份驗證系統都會以安全的方式爲您處理會話令牌。

相關問題