Rails - has_secure_password,带密码和PIN - password_digest限制

时间:2013-07-16 01:58:16

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

我希望有两层身份验证 - 我称之为“硬”和“软”身份验证。硬层是标准的电子邮件和密码层。我目前使用此{Railscast:has_secure_password中描述的bcrypt-ruby gem#250 Authentication from Scratch (revised)来实现此目的。

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

我的问题

我如何使用has_secure_password进行这两层身份验证,因为它具有“password_digest”列依赖性(似乎不可自定义或可扩展)?我想创建一个“pin_digest” “Users表上的列,只是将其视为另一个密码,但似乎has_secure_password不支持此功能。

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

为什么我要尝试这样做?

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

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

实践中的样子

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

示例

  • Frank开始工作并登录(使用“硬”身份验证 - 输入电子邮件地址和密码)到共享自助服务终端。
  • 弗兰克在自助终端上做了一些工作。
  • 乔开始工作,还需要使用自助终端。
  • Joe在用户列表中单击他的名字,然后提示他输入的4位数PIN(“软”身份验证)。
  • Frank不再是活跃用户。
  • Joe现在是活跃用户。
  • 在Frank需要再次使用自助服务终端之前,Joe做了一段时间的工作。
  • Frank从用户列表中单击他的名字,然后提示他输入的4位数PIN。
  • 当Frank完成后,他点击“退出”按钮。下一个想要使用自助服务终端的人必须使用“硬”身份验证登录。

1 个答案:

答案 0 :(得分: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

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