在我的Rails应用程序中,我使用devise来管理具有devise默认配置的用户。在进入设计层之前,我需要md5用户提供的密码。也就是说,包括两个步骤:
(1) (2)
password_in_plain --- password_in_md5 --- password_in_bcrypt.
第一个(1)是我们的关注,最后一个(2)不是(设计照顾它)。
我生成了两个设计控制器:注册和会话,并添加了一个before_filter来完成工作 - md5是用户提供的普通密码。用户可以注册成功,但登录始终失败。这是我的代码:
class Users::RegistrationsController < Devise::RegistrationsController
before_filter :md5_password_params, only: [:create]
protected
def md5_password_params
params[:user][:password] = Digest::MD5.hexdigest(params[:user][:password])
params[:user][:password_confirmation] = Digest::MD5.hexdigest(params[:user][:password_confirmation])
end
end
class Users::SessionsController < Devise::SessionsController
before_filter :md5_password, only: [:create]
protected
def md5_password
params[:user][:password] = Digest::MD5.hexdigest(params[:user][:password])
end
end
这里有什么问题?请帮忙。提前谢谢。
背景:我的其他一个服务器应用程序(用c ++编写)将直接在同一个数据库中创建用户记录。出于安全原因,当用户在手机中进行注册时,将向该服务器发送md5密码。
答案 0 :(得分:1)
您可以为Devise创建自己的加密器,而不是在控制器级别执行此操作并使用params。
您希望这样做的一个主要原因是,如果您的用户填写注册表单并使用无效值提交,则密码和确认字段都将包含用户最初输入内容的MD5摘要。这是因为你在将params散列输入模型之前改变它。
再次提交表单意味着密码加密了两次,不再符合用户认为的原始密码。从好的方面来看,它非常安全,因为没人能真正猜出他们的密码;)
根据当前版本的Devise,您应该能够执行以下操作,以确保在创建摘要之前以及尝试将明文与加密密码进行比较之前对密码进行加密。
确保将devise-encryptable
gem添加到您的Gemfile中。它除了默认加密之外还需要其他任何东西
# config/initializers/md5.rb
require 'digest/md5'
module Devise
module Encryptable
module Encryptors
class BCryptPlusMD5 < Base
def self.digest(klass, password)
super(klass, Digest::MD5.hexdigest(password))
end
def self.compare(klass, hashed_password, password)
super(klass, hashed_password, Digest::MD5.hexdigest(password))
end
end
end
end
end
您可以在config/initializers/devise.rb
中配置要使用的加密器 - 但是我无法找到关于类查找如何工作的良好来源。