【问题标题】:Password encryption in RailsRails 中的密码加密
【发布时间】:2015-07-04 23:36:47
【问题描述】:

我有 User 模型并在其上使用 Devise gem。在我的应用程序中,我有一个管理员用户可以注册其他用户(例如:客户)。然后这些用户可以使用随机生成的密码自行登录。 (但没有人可以自己注册,只有admin才能注册用户。)

当我从其他登录用户创建用户时,即管理员用户创建另一个用户时,我想生成一些随机密码,加密并保存到数据库。

如何加密密码,使其与设计授权一起使用。我想我必须使用与设计相同的方法?

我想要这样的东西: 编辑:

def create
  @user = User.new(user_params)
  # set @user.password to some random encrypted password  

  @user.save
end
所以每个创建的用户都会得到一些随机密码。

我问这个的原因是,我认为如果我的加密/解密与设计使用的内容不匹配,用户将无法使用他们的密码登录,因为当他们登录时,他们的输入是通过设计的加密进行加密的.

【问题讨论】:

  • 请发布您的User 模型?您应该将:database_authenticatable 作为一个设计模块。

标签: ruby-on-rails devise


【解决方案1】:

如果您使用的是 Devise 并且启用了 :database_authenticable,则根本不需要您描述的内容。

Devise 保存到数据库时会自动加密,读回时不会解密,但是当您将其存储在密码字段中时,它可以是纯文本,Devise 会注意仅在编写时为您提供(因此在您save 之前它将保持纯文本)。

因此,在您的控制器中创建新用户只需执行以下操作:

def create
  # I assume your form will pass a `params[:password]` in plain text too
  @user = User.new(user_params)
  @user.password_confirmation = params[:password]
  @user.save
end

这对你的目的应该足够了,不需要匹配设备加密

更新 1:

要另外生成一个随机密码,你可以这样做:

require 'securerandom'

def create
  # I assume your form will pass a `params[:password]` in plain text too
  @password = SecureRandom.hex(16)
  @user = User.new(user_params.to_h.merge(password: @password, password_confirmation: @password))
  @user.save
  # Remember to display `@password` in some way to the user
end

【讨论】:

    【解决方案2】:

    您应该将:database_authenticatable 作为User 模型中的设计模块之一。

    来自Devise,上面写着

    Database Authenticatable:将密码加密并存储在 数据库以在登录时验证用户的真实性。 身份验证可以通过 POST 请求或 HTTP Basic 完成 身份验证。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      • 2010-10-23
      • 2012-09-11
      • 2014-04-20
      相关资源
      最近更新 更多