【问题标题】:Kiosk-like web application - how do I "lock" the app?类似 Kiosk 的 Web 应用程序 - 我如何“锁定”应用程序?
【发布时间】:2014-04-28 22:43:52
【问题描述】:

问题:什么是“锁定”Rails Web 应用程序的好方法,这样用户必须输入凭据才能解锁它(但这样用户仍然登录到应用程序并且根本无法使用该应用程序?解锁)?

我在做什么

我正在构建一个任务管理应用程序,它的行为就像一个供多个用户使用的信息亭。用户可以使用他们的电子邮件地址和密码(完整凭据)登录到应用程序,但是一旦他们进入,他们可以通过从列表中选择他们的姓名并输入四位数的 PIN(简单凭据)来“交换”用户。

为什么有两种类型的凭据?

这是一个多租户应用程序,用户使用“完整凭据”来简单地进入应用程序并选择一个租户。一旦他们进入,他们会经常在新员工轮班和其他员工离开时换掉,因为多个员工将共享一个工作站。

我没有强迫用户重复输入他们的“完整”凭据(通过完全注销/登录),而是创建了一组名称/PIN 凭据,他们可以用来轻松交换。一旦他们使用完整的凭据登录并选择了他们的租户,该应用程序会提供一个用户名的自动完成列表,因此从列表中选择一个人的名字、输入 PIN 和交换用户非常容易。

请注意,此“交换”功能已经构建并可以使用。

为什么我需要锁定应用程序?

当用户登录应用和租户时,他们可能需要离开应用才能去做其他工作。如果没有锁定屏幕,他们只有两种选择:完全退出,以便下一个用户必须输入“完整”凭据才能使用该应用程序,或者只是让他们的帐户保持登录状态以供任何人捣乱。

我想允许他们在他们离开时点击一个按钮来“锁定”应用程序,这样用户就可以让应用程序保持“登录”状态,而不允许其他用户访问其他用户的帐户。一旦他们点击“锁定”,他们所能做的就是输入姓名/PIN 来解锁,或者点击“退出”完全退出。

典型的用例如下所示:

  • Frank 使用他的电子邮件地址和密码登录应用程序。
  • 他完成了一些任务。
  • Jane 想要使用该应用程序,因此她通过从列表中选择她的姓名并输入她的四位 PIN 码来“换入”。
  • 现在 Jane 是登录用户,这意味着她可以完成任务、编辑个人资料和其他活动。
  • 简完成了一些任务,需要去商店做点别的事情,所以她点击了屏幕上的“锁定”按钮。
  • 应用程序现已锁定,需要进行身份验证才能使用(名称和 PIN),或者用户可以单击“退出”以完全退出应用程序。屏幕只会显示类似“应用已锁定。输入您的姓名和 PIN 以将其解锁。”

我理解的选项

这里似乎有两种方法:

  1. 某种 JavaScript
  2. 某种使用会话变量或 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


【解决方案1】:

这是我最终构建的。

回答我自己的问题:

我是否应该使用某种应用程序控制器过滤器(之前或周围)来检查应用程序是否被锁定?我在我的应用程序控制器中使用 before_filter 来检查 UI 是否锁定。如果它被锁定,我会重定向到“锁定”屏幕。然后,我在 Sessions Controller 中的相关操作中添加了一个 skip_before_filter(当用户导航到 Sessions 控制器中的“锁定”屏幕和相关锁定/解锁操作时,基本上忽略了 before_filter。

或者这是应该在视图层处理的事情?在视图层中,我主要只需要创建实际的“锁定”屏幕(用户输入凭据以解锁应用程序) ),并且我确保在 UI 被锁定时隐藏导航元素(这样用户不会对他们为什么单击“编辑配置文件”并且不离开锁定屏幕感到困惑)。

我正在使用 cookie 来记录 UI 的当前状态(锁定与否)。下面是一些sn-ps的代码:

application_controller.rb

before_filter :confirm_unlocked_ui

private

def confirm_unlocked_ui
  if signed_in? && locked_ui?
    redirect_to locked_path
  end
end

sessions_helper.rb

def locked_ui?
  session[:locked] == '1'
end

def lock_ui
  session[:locked] = '1'
  session[:locked_by] = current_user.id
  session[:locked_at] = Time.zone.now
end

def unlock_ui
  session.delete(:locked)
  session.delete(:locked_by)
  session.delete(:locked_at)
end

sessions_controller.rb

def lock
  session[:return_to] = params[:return_to] if params[:return_to]
  lock_ui

  redirect_to locked_path
end

def locked
  #essentially just a view
end

def unlock
  user = User.find_by_id(params[:session][:unlock_user_id]) 
  if user && user.authenticate_with_pin(params[:session][:pin])
    cookies[:auth_token] = user.auth_token
    unlock_ui
    redirect_back_or root_path
  else      
    flash.now[:error] = "Invalid PIN."
    render 'locked'
  end
end

def destroy
  sign_out
  unlock_ui
  redirect_to root_path
end

我真的不知道这个解决方案有多“好”,我在这里发布它的一个原因是看看其他人是否提出了更好的想法,或者看到我如何做到这一点时潜伏的任何问题。

如果您尝试这样做,您可能需要考虑一些更微妙的事情:

  • 我正在使用 CanCan 进行授权,我在此处省略了它。如果您有基于角色的授权或类似的东西,请务必检查这是否适用于每个角色。
  • 请注意,如果用户不想“解锁”,我允许他们“退出”。我使用会话控制器的“销毁”操作执行此操作,并确保在退出后重定向它们之前“解锁_ui”。如果我不这样做,那么当他们下次从该浏览器登录时,该应用仍将被“锁定”。
  • locked_pa​​th 是响应获取请求的 Sessions#locked(基本上只是一个视图/表单)的别名。
  • Sessions#Lock 也会响应获取请求。
  • Sessions#Unlock 是从“锁定”视图提交表单时调用的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-13
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多