Подтвердить что ты не робот

Случайно сгенерированный пароль Rails 3.1

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

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

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

User_model:

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

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

4b9b3361

Ответ 1

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

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

require 'securerandom'
SecureRandom.hex(8)

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

Создать 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 и т.д.