2012-01-30 3 views
13

새로운 웹 응용 프로그램의 목적을 위해, 나는 내 가입 페이지 (마녀는 관리자 만 해당)의 이메일 필드 하나만 필요합니다.무작위로 생성 된 암호 Rails 3.1

것은

내가 270 마녀 has_secure_password 방법을 사용 Railscast 번호를 사용하여 내위한 인증을 생성 ... 정말 어려운 날입니다 같은 기본 것들 ​​레일에서 완전히 새로운 그래서 심지어 메신저입니다. 당장은 모든 것이 잘 작동합니다.이 모든 불평이 필요 없습니다. 나는 또한 액션 메일러를 사용하여 생성 된 비밀번호를 그의 이메일 주소로 보내고 싶습니다. 헥스 (8) 암호 (내가 SecureRandom의를 보았다 그러나 감가 상각 것 같다) 완벽 할 것

Users_Controller :에, 지금은

class User < ActiveRecord::Base 
    attr_accessible :email 
    has_secure_password 
    validates_presence_of :password, :email, :on => :create 
end 

:

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 내 견해, 나는 2 개의 들판을 가지고있다. 그러나 이전에 말했듯이, 나는 단지 하나만 원합니다. 나는 has_secure_password 마녀가 해시/소금에 관해 꽤 좋은 보안을 제공하는 것처럼 보이는 것을 계속 사용하고 싶습니다.

+0

"내 사용자의 비밀번호를 설정하고 이메일을 보내려면 어떻게합니까?" –

+0

기본적으로 나는 암호를 생성하고 내 메일러보기에서 액세스 할 수 있도록 변수에 설정하고 마녀가 password_manifest로 내 db에 저장되는 무언가를 작성하려고합니다. 그 일을하는 방법을 모릅니다. –

+0

좋아, 그래서 프레드릭이 말한대로 했어. @random = SecureRandom.hex (8)을보기에 전달하지 않고 그것을 할 수있는 방법이 있습니까? 내가 무엇을 해야할지 몰랐기 때문에 그것을 내 견해로 전달했습니다. 숨겨진 필드로, 그럼 내가 만드는 메서드에서 다시 사용합니다 ... 그래서 그 컨트롤러>보기> 컨트롤러 - 아무것도 - –

답변

36

레일 루비의 SecureRandom에 불과 다리 중 하나 (루비 버전에 따라) ActiveSupport::SecureRandom입니다 제공 또는 지금 (내 기억이 맞다면 SecureRandom은 1.8.7에서 추가되었다)

루비의 이전 버전에 그것을 다시 구현 Rails가 지원하는 모든 버전의 Ruby는 SecureRandom이 내장되어 있으며 ActiveSupport::SecureRandom은 더 이상 필요하지 않으며 더 이상 사용되지 않습니다. SecureRandom 자체 것은 아무데도 없다 -

require 'securerandom' 
SecureRandom.hex(8) 

잘해야

1

Ruby 코어에 추가 된 기능을 복제하기 때문에 레일스의 기능이 사용되지 않는 경우가 있는데, SecureRandom이 그 중 하나 인 것 같습니다.

임의 생성기 방법 중 하나를 사용하여 일회용 암호를 생성 할 수 있습니다.

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

비밀번호에 보안 난수 생성을 사용해야한다고 생각합니다. –

6

여기에 간단한 코드가 무작위입니다 (당신은 실제 난수의 같은 양의 컴팩트 표현에 대한 SecureRandom.urlsafe_base64을 고려하는 것이 좋습니다) 암호는 lenth로 8

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

희망이 있습니다.

+0

완벽 해요! 내가 필요한 것. 감사합니다. y 우! :) –

+2

to_a + ('a'.. 'z'). to_a + ('A'.. 'Z'). to_a) .shuffle .first (8) .join' 특수 문자없이 알파 숫자 기호 만 가져 오기 – arnep

+2

비밀번호에 대해 안전한 난수 생성 기능을 사용하면 안됩니까? –

0

Randomunique 토큰/암호 여기에 주요 목적은 임의 토큰을 생성하고 데이터베이스에 그 토큰을 반복하지 않는 것입니다

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 등을 생성하는 것과 같은 경우에 유용 할 수 있습니다.