Rails 3.1中的随机生成密码

21

为了新的Web应用程序,我需要在注册页面(仅管理员可以访问)上只有一个电子邮件字段。

问题是我完全不懂Rails,所以即使像这样的基本东西对我来说也很困难...

我使用Railscast #270创建了我的认证,其中使用了has_secure_password方法。目前,除了我不需要所有这些废话之外,一切都很顺利... 我还想使用Action Mailer将生成的密码发送到他的电子邮件地址。一个hex(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

用户模型:

class User < ActiveRecord::Base
  attr_accessible :email
  has_secure_password
  validates_presence_of :password, :email, :on => :create
end

目前,我有两个字段。但正如我之前所说,我只想要一个。 我想继续使用 has_secure_password,它似乎提供了相当好的哈希/盐值安全性。


你的问题是“如何为我的用户设置密码并将其发送给他们吗?” - Jesse Wolgamott
基本上,我想编写一个能够生成密码并将其设置为变量的程序,以便从我的邮件视图中访问,并将其存储在我的数据库中作为password_manifest。我不知道如何完成这些任务。 - boby lapointe
好的,我做了Frederick说的事情。效果很好,但是有没有一种方法可以不将@random = SecureRandom.hex(8)传递给视图呢? 因为我不知道该怎么做,所以我将它作为隐藏字段传递到我的视图中,然后在创建方法中重用它... 所以这是控制器 > 视图 > 控制器做了无用功 -_- - boby lapointe
在控制器的创建方法中,设置密码,然后将其传递给用户,再传递给用户邮件发送程序。 - Jesse Wolgamott
4个回答

52

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来更紧凑地表示相同数量的实际随机性)。


7

这里是一个生成长度为8的随机密码的简单代码:

rand_password=('0'..'z').to_a.shuffle.first(8).join

希望这能有所帮助。

太棒了!正是我所需要的。谢谢你! :) - Sankalp Singha
2
我使用了 rand_password = (('0'..'9').to_a + ('a'..'z').to_a + ('A'..'Z').to_a).shuffle.first(8).join 来获取仅包含字母和数字的密码,不包含特殊字符。 - arnep
3
你是否应该使用安全的随机数生成方式来创建密码? - Andrew Grimm
问题在于我总是得到相同的结果“GCjE2psB”。 - J Edward Ellis

1
创建随机且唯一的令牌/密码
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

这里的主要目标是生成随机令牌,并且不在数据库中重复该令牌。这对于一些情况非常有用,例如生成唯一令牌、唯一发票号码等。


1
有时候Rails中的一些功能被弃用,是因为它们复制了已经添加到Ruby核心的功能,SecureRandom似乎就是其中之一。
您可以使用任何这些随机生成器方法来生成一次性密码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接