出于新的网络应用程序的目的,我需要在我的注册页面(仅限管理员)上只有一个电子邮件字段。
问题是我在轨道上是全新的,所以即使是基本的东西对我来说也很难......
我使用Railscast#270创建了我的身份验证,它使用 has_secure_password 方法。 就目前而言,一切都很好,除了我不需要所有这些背叛...... 我还想使用Action Mailer将生成的密码发送到他的电子邮件地址。 十六进制(8)密码将是完美的(我已经看到 SecureRandom 但它似乎已被折旧)
Users_Controller:
class UsersController < ApplicationController
skip_before_filter :is_connected?, :only => [:new, :create]
def new
@user = User.new
end
def create
@user = User.new(params[:user])
if @user.save
# Tell the Mailer to send a welcome Email after save
Mailer.confirm_email(@user).deliver
redirect_to root_url, :notice => "Signed up!"
else
render "new"
end
end
end
User_model:
class User < ActiveRecord::Base
attr_accessible :email
has_secure_password
validates_presence_of :password, :email, :on => :create
end
目前,在我看来,我有两个字段。但正如我先前所说,我只想要一个。 我想继续使用has_secure_password,它似乎提供了关于hash / salt的相当好的安全性。
答案 0 :(得分:43)
Rails提供ActiveSupport::SecureRandom
其中任何一个(取决于Ruby版本)只是Ruby SecureRandom
的桥梁,或者在旧版本的Ruby上重新实现它(如果我的内存是正确的SecureRandom
是添加于1.8.7)
现在不再需要Rails支持的所有Ruby版本SecureRandom
内置ActiveSupport::SecureRandom
,并且已弃用。 SecureRandom
本身无处可去 -
require 'securerandom'
SecureRandom.hex(8)
应该没问题(您可能需要考虑SecureRandom.urlsafe_base64
以获得相同数量的实际随机性的更紧凑的表示形式)
答案 1 :(得分:5)
这是一个简单的随机密码代码,带有lenth 8
rand_password=('0'..'z').to_a.shuffle.first(8).join
希望它会有所帮助。
答案 2 :(得分:1)
有时Rails的内容被弃用,因为它们复制了已添加到Ruby核心的功能,而SecureRandom似乎就是其中之一。
您可以使用任何这些随机生成器方法生成一次性密码。
答案 3 :(得分:0)
创建Random
和unique
令牌/密码
class User < ActiveRecord::Base
before_create :generate_password
def generate_password
self.password = loop do
random_token = SecureRandom.urlsafe_base64
# If you are using FFaker gem then you can use it otherwise
# SecureRandom is great choice
# random_token = FFaker::Internet.password
break random_token unless User.exists?(password: random_token)
end
end
end
这里的主要对象是生成随机令牌,不要在数据库中重复该令牌。对于某些情况,例如生成unique token
,unique invoice number
等
答案 4 :(得分:-1)
class User < ActiveRecord::Base
def self.encrypt(pass, salt)
return Digest::MD5.hexdigest(pass.to_s+salt.to_s)
end
def self.random_string(len)
chars = ("a".."z").to_a + ("A".."Z").to_a + ("0".."9").to_a
newpass = ""
1.upto(len) { |i| newpass << chars[rand(chars.size-1)] }
return newpass
end
def new_password=(pass)
return if pass.blank?
self.salt = User.random_string(10) if self.salt.nil?
self.password_hash = User.encrypt(pass, self.salt)
end
end