我想要两层身份验证——我将它们称为“硬”和“软”身份验证。硬层是标准的电子邮件和密码层。我目前使用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”列,并将其视为另一个密码,但似乎 has_secure_password 不支持这一点。
我也很好奇是否有人对我如何实际实现这一点有任何建议,或者出于某种原因这似乎是一个坏主意。
我为什么要这样做?
我正在编写一个用于共享信息亭的应用程序,我想让用户尽可能轻松地切换出去,而不必每次都输入他们的完整登录凭据。这将在人们快速移动的零售店环境中使用,并且每次切换时输入完整的电子邮件地址和密码可能既麻烦又缓慢。
如果有人有任何好主意,我愿意接受建议和方法。:)
它在实践中的样子
- 用户使用“硬”身份验证登录。
- 一旦用户使用“硬”身份验证登录,其他用户只需从用户列表中选择自己并输入他们的 PIN 即可进行交换。
- 用户可以随意使用他们的 PIN 进行交换。
- 一旦有人单击“硬”注销按钮,则所有用户都将被注销,并且必须使用“硬”身份验证才能重新登录。
一个例子
- Frank 开始工作并登录(使用“硬”身份验证 - 输入电子邮件地址和密码)到共享信息亭。
- 弗兰克在售货亭做了一些工作。
- 乔开始工作,还需要使用信息亭。
- Joe 在用户列表上单击他的名字,然后系统提示他输入他的 4 位 PIN(“软”身份验证)。
- Frank 不再是活跃用户。
- Joe 现在是活跃用户。
- 在弗兰克需要再次使用信息亭之前,乔做了一些工作。
- Frank 从用户列表中单击他的姓名,然后系统提示他输入他的 4 位 PIN 码。
- 当弗兰克完成后,他单击“注销”按钮。下一个想要使用信息亭的人必须使用“硬”身份验证登录。