2012-02-26 3 views
0

사용자가 올바른 전자 메일 및 암호를 사용하여 데이터베이스에 존재하더라도 User.authenticate 메서드는 nil을 반환합니다. 이것은 세션 컨트롤러 또는 레일즈 콘솔 (irb)의 Create 액션에서 authenticate 메소드를 호출 할 때 발생합니다.User.authenticate 메소드가 Rails 3에서 nil을 반환합니까?

이 문제에 대한 도움을 주시면 대단히 감사하겠습니다. 서버 로그를 확인하는

class User < ActiveRecord::Base 

    attr_accessor :password 
    attr_accessible :first_name, :last_name, :email, :password, :password_confirmation,  
        :account_type, :email_confirmed, :weight 

    validates :password, :presence => true, 
        :confirmation => true, 
        :length => { :within => 6..40 } 

    before_save :encrypt_password 

    def has_password?(submitted_password) 
    encrypted_password == encrypt(submitted_password) 
    end 

    def self.authenticate(email, submitted_password) 
    user = find_by_email(email) 
    return nil if user.nil? 
    return user if user.has_password?(submitted_password) 
    end 

    def self.authenticate_with_salt(id, cookie_salt) 
    user = find_by_id(id) 
    (user && user.salt == cookie_salt) ? user : nil 
    end 

    private ################################################# 

    def encrypt_password 
    self.salt = make_salt if new_record? 
    self.encrypted_password = encrypt(password) 
    end 

    def encrypt(string) 
    secure_hash("#{salt}--#{string}") 
    end 

    def make_salt 
    secure_hash("#{Time.now.utc}--#{password}") 
    end 

    def secure_hash(string) 
    Digest::SHA2.hexdigest(string) 
    end 

    def generate_email_conf_code 
    email_conf_code = secure_hash("#{Time.now.utc}") 
    self.email_conf_code = email_conf_code 
    end 

end 
+0

당신은 그것을 좁히고'find_by_email (email)'또는'user.has_password? (submitted_password)'로 인해 nil을 반환하는지 결정한 적이 있습니까? – James

+1

'nil'을 얻을 때'params'는 어떻게 생겼을까요? 그리고 일치시킬 이메일과 비밀번호는 무엇입니까? –

+0

nil을 리턴하는 것은 user.has_password? (submitted_password)입니다. 나는 아직도 이유를 알 수 없다. 적절한 매개 변수가 user.authenticate에 제출됩니다. params를 디버그 페이지에 덤핑하여 확인했습니다. –

답변

0

시도 :

class SessionsController < ApplicationController 

    def new 
    end 

    def create 
     user = User.authenticate(params[:session][:email], 
            params[:session][:password]) 
     if user.nil? 
     flash.now[:error] = "Invalid email/password combination" 
     render 'new' 
     else 
     sign_in user 
     redirect_to user 
     end  
    end 

    def destroy 
     sign_out 
     render 'pages/options' 
    end 

end 

여기 내 사용자 모델입니다. 터미널에서 직접 모니터링 할 수도 있습니다. 서버에서 수신 한 세션 전자 메일을 찾습니다. 레일 3.1.1에서 이와 같이 보입니다.

Parameters: {"session"=>{"email"=>"[email protected]", "password"=>"[FILTERED]"}} 

이메일이 올바르게 전달되는지 확인하십시오. 그렇지 않다면, 당신은 무엇을 해야할지 알 것입니다.

0

데이터베이스에 password_digest 또는 encrypted_password 열을 저장합니까? michael hartl이 작성한 이전 자습서에서는 password_digest를 사용했지만 이제는 encrypted_password 인 것 같습니다.

관련 문제