2012-01-30 13 views
13

ai fini di una nuova app Web, avrei bisogno nella mia pagina di registrazione (che è solo amministratore) solo un solo campo di posta elettronica.Password generata in modo casuale Rails 3.1

La cosa è che im totalmente nuovo a rotaie e quindi anche basi cose del genere sono per me davvero difficile ...

ho creato il mio autentificazione usando Railscast # 270 strega utilizza has_secure_password metodo. Per ora, tutto funziona alla grande, eccetto che non ho bisogno di tutta questa bullcrap ... Voglio anche usare Action Mailer per inviare la password generata al suo indirizzo email. Un esagono (8) la password sarebbe perfetto (ho visto SecureRandom ma sembra essere ammortizzate)

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 

Per ora, in il mio punto di vista, ho 2 campi. Ma come ho detto prima, ne voglio solo uno. Mi piacerebbe continuare a usare has_secure_password che sembra offrire una buona sicurezza per quanto riguarda hash/sale.

+0

La tua domanda "come posso impostare la password per il mio utente e inviarlo via email?" –

+0

Fondamentalmente voglio scrivere qualcosa che generi una password e impostarla in una variabile per essere accessibile dalla mia vista mailer e che sarà memorizzata nel mio db come password_manifest. Non ho idea di come fare queste cose. –

+0

OK, quindi ho fatto quello che ha detto Frederick Ha funzionato benissimo ma c'è un modo per farlo senza passare @random = SecureRandom.hex (8) alla vista? Perché non sapevo cosa fare così l'ho passato alla mia vista come hidden_field, quindi lo riutilizza nel mio metodo di creazione ... Quindi il suo controller> visualizza> controller per niente -_- –

risposta

36

Rails fornisce ActiveSupport::SecureRandom che o (a seconda della versione di Ruby) è solo un ponte per Ruby SecureRandom o reimplementato su vecchie versioni di Rubino (se la memoria non è corretto SecureRandom è stato aggiunto a 1.8.7)

Ora che tutte le versioni di Ruby supportate da Rails hanno SecureRandom integrato non sono più necessarie ed è stato dichiarato obsoleto. SecureRandom si sta andando da nessuna parte -

require 'securerandom' 
SecureRandom.hex(8) 

dovrebbe fare bene (si potrebbe prendere in considerazione SecureRandom.urlsafe_base64 per una rappresentazione più compatta della stessa quantità di casualità effettivo)

1

A volte le cose da Rails sono deprecate perché duplicano la funzionalità che è stata aggiunta al nucleo di Ruby, e SecureRandom sembra essere una di quelle cose.

È possibile utilizzare uno qualsiasi di questi metodi di generatore casuale per produrre una password monouso.

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

Penso che per le password debba essere utilizzata la generazione sicura di numeri casuali –

6

Ecco un semplice codice per casuale password con lenth 8

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

Spero che possa essere d'aiuto.

+0

Perfetto! Proprio quello di cui avevo bisogno. ou! :) –

+2

Ho usato 'rand_password = (('0' .. '9'). A_a + ('a' .. 'z'). A_a + ('A' .. 'Z'). A_a) .shuffle .primo (8) .join' per ottenere solo segni alfanumerici senza caratteri speciali – arnep

+2

Non dovresti utilizzare la generazione sicura di numeri casuali per le password? –

0

Per creare Random e unique gettone/password

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 

Lo scopo principale è quello di generare token di casuale e non ripetere quella pedina nel database. Può essere davvero utile in alcuni casi come la generazione di unique token, unique invoice number, ecc.