我有一个使用 Devise (最新的)的 Rails 4 应用程序,并尝试为每个用户创建一个随机令牌(如 ID,但更长等)使用this https://stackoverflow.com/questions/6021372/best-way-to-create-unique-token-in-rails回答我能够想出以下代码:
# app/models/model_name.rb
class ModelName < ActiveRecord::Base
include Tokenable
end
# app/models/concerns/tokenable.rb
module Tokenable
extend ActiveSupport::Concern
included do
before_create :generate_token
end
protected
def generate_token
self.token = loop do
random_token = SecureRandom.urlsafe_base64(nil, false)
break random_token unless self.class.exists?(token: random_token)
end
end
end
对于任何给定模型唯一的标记,此代码非常有效。 IE。所有用户都将拥有唯一的令牌,所有管理员都将拥有唯一的令牌。但管理员可能拥有与用户相同的令牌 - 这种行为是不受欢迎的。
有没有一种优雅的方法,可以将令牌抽象到自己的模型中并使用“has_one”关系来确保令牌不存在于它所属的所有模型中?
(我想我可以硬编码unless (User.exists? ... or Admin.exists? ... )
进入除非子句,尽管这看起来很庞大。)
任何想法或建议表示赞赏!谢谢!
Rails 5 带来了一个新功能has_secure_token
真的很容易使用:
# Schema: User(token:string, auth_token:string)
class User < ActiveRecord::Base
has_secure_token :auth_token
end
user = User.new
user.save
user.auth_token # => "pX27zsMN2ViQKta1bGfLmVJE"
user.regenerate_auth_token # => true
由于 Rails 5 尚未发布,您可以使用 Backport有_安全_令牌 http://github.com/robertomiranda/has_secure_token gem
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)