2012-01-30 6 views
13

dans le but d'une nouvelle application web, j'aurais besoin sur ma page d'inscription (qui est administrateur seulement) un seul champ email.Rails générés aléatoirement Rails 3.1

La chose est que im totalement nouveau sur des rails et ainsi de même des choses comme bases qui sont pour moi vraiment difficile ...

J'ai créé mon Railscast # en utilisant l'authentification 270 utilise sorcière méthode has_secure_password. Pour l'instant, tout fonctionne très bien sauf que je n'ai pas besoin de tout ce bullcrap ... Je veux aussi utiliser Action Mailer pour envoyer le mot de passe généré à son adresse e-mail. Un hexagone (8) mot de passe serait parfait (je l'ai vu SecureRandom mais il semble être amorti)

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 

Pour l'instant, en A mon avis, j'ai 2 champs. Mais comme je l'ai dit plus tôt, je n'en veux qu'une. Je voudrais continuer à utiliser has_secure_password qui semble offrir une très bonne sécurité en ce qui concerne le hachage/sel.

+0

Est-ce que votre question "comment puis-je définir le mot de passe pour mon utilisateur et lui envoyer un courriel?" –

+0

Fondamentalement, je veux écrire quelque chose qui génèrerait un mot de passe et le définir dans une variable afin d'être accessible à partir de ma vue mailer et qui sera stocké dans mon db comme password_manifest.Je n'ai aucune idée de comment faire ces choses –

+0

OK, donc j'ai fait ce que Frederick a dit A travaillé bien mais y at-il un moyen de le faire sans passer @random = SecureRandom.hex (8) à la vue? Parce que je ne savais pas quoi faire ainsi je l'ai passé à mon vue comme un hidden_field, alors je le réutilise dans ma méthode de création ... Ainsi son contrôleur> vue> contrôleur pour rien -_- –

Répondre

36

Rails fournit ActiveSupport::SecureRandom qui soit (selon la version Ruby) est juste un pont de SecureRandom Ruby ou réimplémentées sur les anciennes versions de Ruby (si ma mémoire est correcte SecureRandom a été ajouté au 1.8.7)

maintenant que toutes les versions de Ruby que Rails prend en charge ont SecureRandom intégré ActiveSupport::SecureRandom n'est plus nécessaire et a été obsolète. SecureRandom lui-même ne va nulle part -

require 'securerandom' 
SecureRandom.hex(8) 

devrait faire amende (vous voudrez peut-être envisager de SecureRandom.urlsafe_base64 pour une représentation plus compacte de la même quantité de caractère aléatoire réelle)

1

Parfois, les éléments de Rails sont obsolètes car ils dupliquent les fonctionnalités qui ont été ajoutées au cœur Ruby, et SecureRandom semble être l'une de ces choses.

Vous pouvez utiliser n'importe laquelle de ces méthodes de générateur aléatoire pour produire un mot de passe à utilisation unique.

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

Je pense que la génération de nombres aléatoires sécurisés devrait être utilisée pour les mots de passe –

6

Voici un code simple pour aléatoire mot de passe avec lenth 8

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

Espérons que cela aidera.

+0

Parfait! Juste ce dont j'avais besoin. ou! :) –

+2

J'ai utilisé 'rand_password = (('0' .. '9'). To_a + ('a' .. 'z'). To_a + ('A' .. 'Z'). To_a) .shuffle .first (8) .join' pour obtenir uniquement des signes alphanumériques sans caractères spéciaux – arnep

+2

Vous ne devriez pas utiliser la génération aléatoire de nombres aléatoires pour les mots de passe? –

0

Pour créer Random et unique jeton/mot de passe

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 

L'objet principal est de générer ici jeton aléatoire et ne pas répéter ce jeton dans la base de données. Il peut être vraiment utile dans certains cas comme générer unique token, unique invoice number, etc