3

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

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

我的问题

鉴于 has_secure_password 具有“password_digest”列依赖项(似乎不可定制或可扩展),我如何使用 has_secure_password 进行这两层身份验证?我想在用户表上创建一个“pin_digest”列,并将其视为另一个密码,但似乎 has_secure_password 不支持这一点。

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

我为什么要这样做?

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

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

它在实践中的样子

  • 用户使用“硬”身份验证登录。
  • 一旦用户使用“硬”身份验证登录,其他用户只需从用户列表中选择自己并输入他们的 PIN 即可进行交换。
  • 用户可以随意使用他们的 PIN 进行交换。
  • 一旦有人单击“硬”注销按钮,则所有用户都将被注销,并且必须使用“硬”身份验证才能重新登录。

一个例子

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

1 回答 1

0

我正在尝试做类似的事情。到目前为止,我要做的是将输入的 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 %>

控制器看起来像:

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

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

于 2013-07-25T23:29:06.907 回答