【发布时间】:2014-04-28 22:43:52
【问题描述】:
问题:什么是“锁定”Rails Web 应用程序的好方法,这样用户必须输入凭据才能解锁它(但这样用户仍然登录到应用程序并且根本无法使用该应用程序?解锁)?
我在做什么
我正在构建一个任务管理应用程序,它的行为就像一个供多个用户使用的信息亭。用户可以使用他们的电子邮件地址和密码(完整凭据)登录到应用程序,但是一旦他们进入,他们可以通过从列表中选择他们的姓名并输入四位数的 PIN(简单凭据)来“交换”用户。
为什么有两种类型的凭据?
这是一个多租户应用程序,用户使用“完整凭据”来简单地进入应用程序并选择一个租户。一旦他们进入,他们会经常在新员工轮班和其他员工离开时换掉,因为多个员工将共享一个工作站。
我没有强迫用户重复输入他们的“完整”凭据(通过完全注销/登录),而是创建了一组名称/PIN 凭据,他们可以用来轻松交换。一旦他们使用完整的凭据登录并选择了他们的租户,该应用程序会提供一个用户名的自动完成列表,因此从列表中选择一个人的名字、输入 PIN 和交换用户非常容易。
请注意,此“交换”功能已经构建并可以使用。
为什么我需要锁定应用程序?
当用户登录应用和租户时,他们可能需要离开应用才能去做其他工作。如果没有锁定屏幕,他们只有两种选择:完全退出,以便下一个用户必须输入“完整”凭据才能使用该应用程序,或者只是让他们的帐户保持登录状态以供任何人捣乱。
我想允许他们在他们离开时点击一个按钮来“锁定”应用程序,这样用户就可以让应用程序保持“登录”状态,而不允许其他用户访问其他用户的帐户。一旦他们点击“锁定”,他们所能做的就是输入姓名/PIN 来解锁,或者点击“退出”完全退出。
典型的用例如下所示:
- Frank 使用他的电子邮件地址和密码登录应用程序。
- 他完成了一些任务。
- Jane 想要使用该应用程序,因此她通过从列表中选择她的姓名并输入她的四位 PIN 码来“换入”。
- 现在 Jane 是登录用户,这意味着她可以完成任务、编辑个人资料和其他活动。
- 简完成了一些任务,需要去商店做点别的事情,所以她点击了屏幕上的“锁定”按钮。
- 应用程序现已锁定,需要进行身份验证才能使用(名称和 PIN),或者用户可以单击“退出”以完全退出应用程序。屏幕只会显示类似“应用已锁定。输入您的姓名和 PIN 以将其解锁。”
我理解的选项
这里似乎有两种方法:
- 某种 JavaScript
- 某种使用会话变量或 cookie 的控制器逻辑
JavaScript 让我很紧张,因为它非常容易破解。我想确保该应用程序实际上是安全的。
所以我一直在搞乱使用会话变量来执行此操作的方法。这是我一直在尝试的:
- 用户已通过特定租户的应用程序身份验证
- 用户点击“锁定”按钮
- 在 Sessions 控制器中调用了“lock_ui”操作
- 该操作设置了一些会话变量(session[:locked]、session[:locked_by]、session[:locked_at])
- 然后应用程序总是重定向到 Sessions#locked,它会显示“This is locked. Enter name and PIN to unlock”表单,除非它已解锁或用户单击“退出”。
- 一旦用户输入了有效的姓名/PIN,这些会话变量就会被删除,并且应用程序会正常运行。
关于如何确保安全的任何建议?
我挂了的东西:
- 我是否应该使用某种应用程序控制器过滤器(之前或前后)来检查应用程序是否被锁定?如果应用程序被锁定,应用程序控制器会做什么? (它是调用其他操作,直接渲染“锁定”页面,还是其他?)
- 或者这是否应该在视图层中处理?例如,我可以更新我的应用程序布局,使其具有“如果 lock_ui 呈现'锁定'屏幕,否则屈服”。
关于我目前的设置的一些说明:
- 这是一个 Rails 4.1.0 应用程序,使用 Heroku 上托管的 Ruby 1.9.3。
- 我正在使用CanCan 进行授权
- 我正在使用multi-tenancy with scopes(并且我没有使用子域)
- 每个用户只有一个可以访问多个租户的帐户
- 我见过JQuery BlockUI,但它似乎更像是一个虚荣的东西,而不是功能安全设备
【问题讨论】:
-
Rails 4.1 无法使用 Ruby 1.9.3。您必须使用 Ruby 2.0 或更高版本。你可能想看看你的要求的设计宝石。
-
我不确定这是不是真的。我刚刚从我的项目文件夹中运行了 ruby -v 和 rails -v,我得到了 Ruby 版本 1.9.3p374 和 Rails 版本 4.1.0。
标签: ruby-on-rails security authentication authorization