Поле пользовательского пароля с дизайном (рубин)

72
8

Я использую базу данных, разделяемую между двумя приложениями rails.

Веб-приложение, использующее BCrypt и has_secure_password для аутентификации пользователя и моего приложения, REST API, используя Devise для аутентификации пользователей. Пароль хеш тот же.

Итак, я хотел бы использовать поле password_digest вместо encrypted_password для аутентификации через 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

спросил(а) 2013-04-05T10:19:00+04:00 7 лет, 8 месяцев назад
1
Решение
74

Я не знаю, как работает 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 =.

ответил(а) 2013-04-05T11:31:00+04:00 7 лет, 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема