Назначьте случайный пароль пользователю при создании - PullRequest
1 голос
/ 14 марта 2012

У меня есть пользовательская таблица в моей базе данных, и я хочу, чтобы для каждого пользователя был создан случайный пароль, который затем отправлялся на его адрес электронной почты.Мне было интересно, как бы я назначил случайный пароль.

На мой взгляд, в моем контроле:В моей модели пользователя есть следующее:

attr_accessor :password
before_save :encrypt_password

def encrypt_password
    if password.present?
    self.password_salt = BCrypt::Engine.generate_salt
    self.password_hash = BCrypt::Engine.hash_secret(password, password_salt)
   end
end

def self.random_string(len)
    #generate a random password consisting of strings and digits
    chars = ("a".."z").to_a + ("A".."Z").to_a + ("0".."9").to_a password = ""
    1.upto(len) { |i| password << chars[rand(chars.size-1)]}
    return password
end

def self.authenticate(email, password)
    user = find_by_email(email)
    if user && user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt)
    user
 else
    nil
 end
end

Мне придется удалить свой if password.present?строка, потому что она не будет присутствовать, но у меня есть случайный строковый код, мне просто нужно присвоить его хешу / соли.

Ответы [ 2 ]

2 голосов
/ 14 марта 2012
def create
 @user = User.new(params[:user])
 @user.password = User.random_string(10) #set it with the size of the password you want
 respond_to do |format|
   if @user.save
    Notifier.user_created(@user).deliver
       format.html { redirect_to @user, notice: 'User was successfully created.' }
       format.json { render json: @user, status: :created, location: @user }
    else
       format.html { render action: "new" }
       format.json { render json: @user.errors, status::unprocessable_entity }
    end
  end
end

веселись!

1 голос
/ 14 марта 2012

Полагаю, вы можете просто изменить свой encrypt_password;)

before_save :encrypt_password

def encrypt_password
    self.password = User.random_string(X) unless password.present?
    self.password_salt = BCrypt::Engine.generate_salt
    self.password_hash = BCrypt::Engine.hash_secret(password, password_salt)
end

EDIT: если вы хотите зашифровать пароль только при создании, вы можете использовать «before_create» вместо «before_save»

...