2012-01-30 23 views
13

con el propósito de una nueva aplicación web, necesitaría en mi página de registro (solo es administrador) un solo campo de correo electrónico.Contraseña generada aleatoriamente Rails 3.1

Lo que pasa es que soy totalmente nuevo en los carriles y por lo que incluso lo básico cosas como que son para mí muy difícil ...

he creado mi autentificación utilizando Railscast # 270 bruja utiliza has_secure_password método. Por ahora, todo funciona bien excepto que no necesito todo este bullcrap ... También quiero usar Action Mailer para enviar la contraseña generada a su dirección de correo electrónico. Un hexagonal (8) contraseña sería perfecto (que he visto SecureRandom pero parece ser depreciado)

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 

Por ahora, en mi punto de vista, tengo 2 campos. Pero como dije antes, solo quiero uno. Me gustaría seguir usando has_secure_password que bruja parece ofrecer una muy buena seguridad con respecto a hash/salt.

+0

¿Su pregunta es "cómo puedo establecer la contraseña para mi usuario y enviarla por correo electrónico a ellos?" –

+0

Básicamente quiero escribir algo que genere una contraseña y configurarla en una variable para que sea accesible desde mi vista de correo y que se almacene en mi db como password_manifest. No tengo ni idea de cómo hacer esas cosas. –

+0

OK, entonces hice lo que dijo Frederick. Funcionó muy bien, pero ¿hay una manera de hacerlo sin pasar @random = SecureRandom.hex (8) a la vista? Porque no sabía qué hacer, así que lo pasé a mi punto de vista como un campo_cubierto, luego lo reutilizo en mi método de creación ... Así que su controlador> ver> controlador para nada -_- –

Respuesta

36

rieles proporciona ActiveSupport::SecureRandom que o bien (dependiendo de la versión de Ruby) es sólo un puente a Ruby de SecureRandom o reimplantado en las versiones anteriores de Ruby (si mi memoria es correcta SecureRandom se añadió en la 1.8.7)

Ahora que todas las versiones de Ruby que admite Rails tienen SecureRandom incorporado ActiveSupport::SecureRandom ya no es necesario y ha quedado obsoleto. SecureRandom sí se va a ninguna parte -

require 'securerandom' 
SecureRandom.hex(8) 

debe hacer bien (es posible que desee considerar SecureRandom.urlsafe_base64 para una representación más compacta de la misma cantidad de aleatoriedad real)

1

A veces las cosas de Rails están en desuso porque duplican la funcionalidad que se ha agregado a Ruby core, y SecureRandom parece ser una de esas cosas.

Puede utilizar cualquiera de esos métodos de generador aleatorio para producir una contraseña de uso único.

0
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 
+0

Creo que se debe usar la generación segura de números aleatorios para las contraseñas. –

6

He aquí un simple código para al azar contraseña con lenth 8

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

Espero que ayude.

+0

¡Perfecto! Justo lo que necesitaba. Gracias y ¡UNED! :) –

+2

Utilicé 'rand_password = (('0' .. '9'). To_a + ('a' .. 'z'). To_a + ('A' .. 'Z'). To_a) .shuffle .first (8) .join' para obtener solo signos alfanuméricos sin caracteres especiales – arnep

+2

¿No debería utilizar la generación segura de números aleatorios para las contraseñas? –

0

Para crear Random y unique símbolo/contraseña

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 

El objetivo principal es generar testigo aleatorio y no repetir esa señal en la base de datos. Puede ser realmente útil en algunos casos como generar unique token, unique invoice number, etc.