我想要两层身份验证 - 我将它们称为“硬”和“软”身份验证。硬层是标准的电子邮件和密码层。我目前使用 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/