Случайно сгенерированный пароль 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, кажется, предлагает довольно хорошую защиту относительно хеша/соли.
Ответы
Ответ 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
и т.д.