ruby-on-rails - Rails - has_secure_password 密码和 PIN - password_digest 限制

标签 ruby-on-rails passwords password-encryption bcrypt-ruby

我想要两层身份验证 - 我将它们称为“硬”和“软”身份验证。硬层是标准的电子邮件和密码层。我目前使用 has_secure_password 实现了这个和 bcrypt-ruby gem如本 Railscast 中所述:#250 Authentication from Scratch (revised) .

对于“软”层,我希望每个用户都有一个 4 位数的 PIN,他们可以使用该 PIN 来验证他们的身份并将他们切换为事件用户。我希望此 PIN 像密码一样加密。

我的问题

如果 has_secure_password 具有“password_digest”列依赖项(似乎无法自定义或扩展),我如何使用 has_secure_password 进行这两层身份验证?我想创建一个“pin_digest” "列在 Users 表上,并将其视为另一个密码,但似乎 has_secure_password 不支持此操作。

我也很好奇是否有人对我如何实际实现它有任何建议,或者出于某种原因这似乎不是个好主意。

我为什么要这样做?

我正在编写一个用于共享信息亭的应用程序,我想让用户尽可能轻松地切换,而不必每次都输入完整的登录凭据。这将用于人们快速移动的零售店环境,每次切换时输入完整的电子邮件地址和密码可能既麻烦又缓慢。

如果有人有任何好的想法,我愿意接受建议和方法。 :)

实际情况如何

  • 用户使用“硬”身份验证登录。
  • 一旦用户使用“硬”身份验证登录,其他用户只需从用户列表中选择自己并输入 PIN 即可进行交换。
  • 用户可以根据需要随时更换 PIN。
  • 一旦有人点击“硬”注销按钮,所有用户都会注销并“硬” 必须使用身份验证才能重新登录。

一个例子

  • Frank 开始工作并登录(使用“硬”身份验证 - 输入电子邮件地址和密码)到共享亭。
  • Frank 在售货亭做了一些工作。
  • Joe 开始工作,还需要使用售货亭。
  • Joe 在用户列表中单击他的名字,然后系统提示他输入 4 位 PIN(“软”身份验证)。
  • Frank 不再是活跃用户。
  • Joe 现在是活跃用户。
  • 在 Frank 需要再次使用售货亭之前,Joe 做了一些工作。
  • Frank 从用户列表中单击他的名字,然后系统提示他输入 4 位数的 PIN。
  • 当 Frank 完成后,他单击“注销”按钮。下一个想要使用信息亭的人必须使用“硬”身份验证登录。

最佳答案

我正在尝试做类似的事情。到目前为止,我要做的是将输入的 PIN 码与他们声称的人的 PIN 码进行比较。所以,表单看起来有点像:

<%= form_for SoftSession.new do |f| %>
  <%= f.hidden_field :person_id, value: person.id %>

  <%= f.label(:pin, "PIN") %>
  <%= f.text_field :pin %>

  <%= f.submit %>
<% end %>

Controller 看起来像:

pin = params[:soft_session][:pin]
person = Person.find(params[:soft_session][:person_id])

if pin == Person.pin
  # go ahead and do stuff!
else
 # nope.
end

我不知道这有多安全,但也许可以用于此目的。

关于ruby-on-rails - Rails - has_secure_password 密码和 PIN - password_digest 限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17666814/

相关文章:

ruby-on-rails - 使用 ransacker 自定义搜索

php - PHP 有像 ruby​​ gem bundler 吗?

ruby-on-rails - 如何在嵌套的Rails模型上设置Elasticsearch方面搜索

perl - Perl 如何在不显示终端的情况下提示输入密码?

mysql - 如何重置丢失的mysql root密码

security - 临时密码安全 - 以纯文本形式存储

谁能解释一下这个C密码哈希算法吗?

security - 双哈希安全

java - 使用 Java 使用 bCrypt 加密密码后,如何将盐与哈希分离?

ruby-on-rails - Rails 'raw' 助手