2014-10-04 34 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,并且猜测随机令牌的难度会更大。您可以通过定期更新令牌来更进一步。但是,大多数身份验证系统都会以安全的方式为您处理会话令牌。

相关问题