随机生成的密码Rails 3.1

时间:2012-01-30 15:25:25

标签: ruby-on-rails random passwords

出于新的网络应用程序的目的,我需要在我的注册页面(仅限管理员)上只有一个电子邮件字段。

问题是我在轨道上是全新的,所以即使是基本的东西对我来说也很难......

我使用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的相当好的安全性。

5 个答案:

答案 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)

创建Randomunique令牌/密码

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 tokenunique 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