Случайно сгенерированный пароль Rails 3.1 - PullRequest
15 голосов
/ 30 января 2012

Для создания нового веб-приложения мне потребуется на моей странице регистрации (которая является только администратором) только одно поле электронной почты.

Дело в том, что я совершенно новичок в рельсах ипоэтому даже такие базовые вещи для меня действительно сложны ...

Я создал свою аутентификацию с использованием 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

Пока, на мой взгляд, у меня есть 2 поля.Но, как я сказал ранее, я хочу только одного.Я хотел бы продолжать использовать has_secure_password, который, кажется, предлагает довольно хорошую защиту в отношении хеша / соли.

Ответы [ 5 ]

43 голосов
/ 30 января 2012

Rails предоставляет ActiveSupport::SecureRandom, который либо (в зависимости от версии Ruby) является просто мостом к SecureRandom в Ruby, либо переопределил его в более старых версиях Ruby (если моя память верна SecureRandom было добавлено в 1.8.7)

Теперь, когда во всех версиях Ruby, поддерживаемых Rails, встроенная SecureRandom ActiveSupport::SecureRandom больше не нужна и устарела.SecureRandom само по себе никуда не денется -

require 'securerandom'
SecureRandom.hex(8)

должно сработать нормально (вы можете рассмотреть SecureRandom.urlsafe_base64 для более компактного представления того же количества фактической случайности)

5 голосов
/ 15 октября 2012

Вот один простой код для случайного пароля с длиной 8

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

Надеюсь, это поможет.

1 голос
/ 30 января 2012

Иногда вещи из Rails устаревают, потому что они дублируют функциональность, которая была добавлена ​​в ядро ​​Ruby, и SecureRandom кажется одной из таких вещей.

Вы можете использовать любую из этих случайныхметоды генератора для создания одноразового пароля.

0 голосов
/ 24 апреля 2015

Для создания 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 и т. Д.

0 голосов
/ 30 января 2012
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
...