2013-04-05 1 views
2

2 개의 레일 앱간에 공유되는 데이터베이스를 사용하고 있습니다.devise (ruby)가있는 사용자 정의 암호 필드

사용자를 인증하기 위해 BCrypt와 has_secure_password를 사용하는 웹 응용 프로그램과 Devise를 사용하여 사용자를 인증하는 내 앱인 REST API를 사용하는 웹 응용 프로그램입니다. 암호 해시는 동일합니다.

그래서 encrypted_password 대신 password_digest 필드를 사용하여 Devise를 통해 인증하고 방법을 모르겠습니다! (나는 문서에서 찾고 있지만 아무것도 찾을 수 없다). 그래서 password_digest에서 encrypted_password로 비밀번호 해시를 복사/붙여 넣기해야합니다. 여기

내 세션 컨트롤러 코드 :

class SessionsController < Devise::SessionsController 

before_filter :ensure_params_exist 

def create 
    build_resource 
    resource = User.find_for_database_authentication(:email => params[:email]) 
    return invalid_login_attempt unless resource 

    if resource.valid_password?(params[:password]) 
     #resource.ensure_authentication_token! #make sure the user has a token generated 
     sign_in("user", resource) 
     render :json => { :authentication_token => resource.authentication_token, :lastname => resource.lastname, :firstname => resource.firstname, :last_sign_in => resource.last_sign_in_at }, :status => :created 
    return 
    end 
    invalid_login_attempt 
end 

#def destroy 
# # expire auth token 
# @user=User.where(:authentication_token=>params[:auth_token]).first 
# @user.reset_authentication_token! 
# render :json => { :message => ["Session deleted."] }, :success => true, :status => :ok 
#end 


protected 
    def ensure_params_exist 
     return unless params[:email].blank? 
     render :json=>{:success=>false, :message=>"missing email parameter"}, :status=>422 
    end 

    def invalid_login_attempt 
     warden.custom_failure! 
     render :json => { :errors => ["Invalid email or password."] }, :success => false, :status => :unauthorized 
    end 

그리고 내 사용자 모델은

class User < ActiveRecord::Base 
    before_save :ensure_authentication_token 
    # Include default devise modules. Others available are: 
    # :token_authenticatable, :confirmable, 
    # :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :trackable, :token_authenticatable#, :registerable, 
     #:recoverable, :rememberable, :trackable, :validatable 

    # Setup accessible (or protected) attributes for your model 
    attr_accessible :email, :password, :password_confirmation, :remember_me, :client_id, :firstname, :group_id, :lastname, :password, :password_confirmation, :role_id, :group_ids, :auth_token, :password_digest, :encrypted_password 

    # Relations dans la base de données 
    belongs_to :client 
    belongs_to :role 

    has_many :memberships 
    has_many :groups, :through => :memberships 



end 

답변

2

어떻게 BCrypt/has_secure_password의 작품에 대한 인식하지,하지만 당신도 을 할 수 다음과 같이 가상 속성을 사용하십시오.

def encrypted_password 
return password_digest 
end 

def encrypted_password= value 
return password_digest 
end 

또는 더 나은 방법으로 별칭 메서드 을 설정하면 encrypted_password 및 encrypted_password =를 password_digest 및 password_digest =의 별칭 메서드로 설정합니다.

+0

안녕하세요, 답변 해 주셔서 감사합니다. 이 코드는 어디에 두어야합니까? 내 사용자 모델에서 시도했지만 오류를 반환하고 내 세션 컨트롤러에서이 코드를 사용해도 인증이 작동하지 않습니다. 사용자 모델에서 감사합니다 – LBStephane

+0

네. 그리고 어떤 오류가 있었습니까? password_digest를 복사하여 복사 할 때 암호화 된 암호에 붙여 넣기에 대해 언급했습니다. 그것에 대한 약간의 세부 사항. – manoj