Rails - 使用has_secure_password同时设置密码和PIN - password_digest的限制

3
我希望有两层身份验证 - 我将它们称为“硬”和“软”身份验证。硬层是标准的电子邮件和密码层。我目前使用has_secure_passwordbcrypt-ruby gem来实现这个功能,如此Railscast中所述:# 250 Authentication from Scratch (revised)
对于“软”层,我希望每个用户都有一个4位数的PIN码,可以用它来验证他们的身份并切换为活动用户。我希望像密码一样加密这个PIN码。
我的问题是:如何使用has_secure_password实现这两层身份验证,考虑到它具有“password_digest”列依赖关系(似乎不可定制或扩展)?我想在Users表中创建一个“pin_digest”列,并将其视为另一个密码,但似乎has_secure_password不支持这种方式。
如果有人对如何实现这个功能有任何建议,或者认为这个功能不好,请告诉我。
我正在编写一个共享亭子的应用程序,希望尽可能地使用户在不用每次输入完整的登录凭据的情况下轻松切换。这将在零售商店环境中使用,人们行动迅速,每次切换都需要输入完整的电子邮件地址和密码可能会很麻烦和缓慢。
实际操作如下:
- 用户使用“硬”身份验证登录。 - 一旦用户使用“硬”身份验证登录,其他用户可以通过简单地从用户列表中选择自己并输入他们的PIN码进行交换。 - 用户可以根据需要使用他们的PIN切换。 - 一旦有人点击“硬”注销按钮,所有用户都会被注销,并且必须使用“硬”身份验证才能重新登录。
  • Frank到达工作地点并使用“硬”认证方式(输入电子邮件地址和密码)登录共享亭。
  • Frank在亭子里做了一些工作。
  • Joe到达工作地点,也需要使用这个亭子。
  • Joe在用户列表中点击自己的名字,然后被提示输入他的4位数字密码(“软”认证),他输入了密码。
  • Frank不再是活跃用户。
  • Joe现在是活跃用户。
  • Joe做了一段时间的工作,之后Frank需要再次使用这个亭子。
  • Frank从用户列表中点击自己的名字,然后被提示输入他的4位数字密码,他输入了密码。
  • 当Frank完成后,他点击“注销”按钮。下一个想要使用该亭子的人必须使用“硬”认证方式进行登录。
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

我不知道这有多安全,但也许对于这个目的来说还可以。


1
我最终解决了这个问题,但忘记回答我的问题了。今天我没时间,但我会尽快回答以供后人参考。正如你所说,我不确定我的解决方案有多安全,但我正在对输入PIN的用户进行身份验证。 - JoshDoody
1
@JoshDoody 你能解释一下你是如何解决这个问题的吗? - shiva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接