Ruby on rails 使用Desive的两层登录(亚马逊风格)

Ruby on rails 使用Desive的两层登录(亚马逊风格),ruby-on-rails,security,authentication,devise,Ruby On Rails,Security,Authentication,Devise,让我们假设我有以下的场景 用户收到一封电子邮件,表示有一个新项目正在等待她 单击链接,可以确认或拒绝项目(跳过详细信息) 然后可以访问她所有项目的列表 诀窍是,我希望允许所有这些在用户未登录的情况下发生,但限制对网站其他部分的访问(如向其他用户发送项目) 我的看法是: 当用户单击链接时,她已登录,但仅在第1层-仅对确认/拒绝操作具有访问权限,对项目索引具有只读权限(此时将创建设计会话) 当用户想要访问网站的其他部分时,将显示登录页面 当用户只需输入urlhttp://example.com并希

让我们假设我有以下的场景

  • 用户收到一封电子邮件,表示有一个新项目正在等待她
  • 单击链接,可以确认或拒绝项目(跳过详细信息)
  • 然后可以访问她所有项目的列表
  • 诀窍是,我希望允许所有这些在用户未登录的情况下发生,但限制对网站其他部分的访问(如向其他用户发送项目)

    我的看法是:

    • 当用户单击链接时,她已登录,但仅在第1层-仅对确认/拒绝操作具有访问权限,对项目索引具有只读权限(此时将创建设计会话)
    • 当用户想要访问网站的其他部分时,将显示登录页面
    • 当用户只需输入url
      http://example.com
      并希望访问要求她登录的自己的帐户
    • 登录后会话“升级”到允许完全访问的层
    • 经过一段时间的不活动后,出于安全原因,会话降级到第1层
    我的灵感来自亚马逊的工作方式——你可以以只读方式访问帐户的大部分内容,但在执行任何破坏性操作之前,你需要登录

    有没有人有过这种方法的经验,或者可以分享一些博客帖子等? 我没有在SO上找到任何东西,谷歌大部分都返回了关于双因素身份验证的信息,但这里的情况并非如此。
    我也知道电子邮件中的链接存在安全问题。

    我认为您混淆了授权和身份验证。Desive是一种身份验证解决方案,这意味着它处理“证明你就是你所说的你”部分。授权是“好的,我知道你是谁,现在让我们看看你能做什么”。除了简单的“已记录/未记录”之外,Desive不提供授权系统。如果您需要更复杂的授权系统,请使用授权gem。CanCan非常受欢迎。

    我认为您混淆了授权和身份验证。Desive是一种身份验证解决方案,这意味着它处理“证明你就是你所说的你”部分。授权是“好的,我知道你是谁,现在让我们看看你能做什么”。除了简单的“已记录/未记录”之外,Desive不提供授权系统。如果您需要更复杂的授权系统,请使用授权gem。CanCan非常受欢迎。

    几个月前,我实施了一个非常类似的行为。我没有非常有趣的资源向您展示,但我可以解释一下您可以如何组织或思考要解决的问题

    说明

  • 对于您所述的问题,一旦您识别了一个用户,您可以为他提供两种不同的状态:

    • 访问受限(执行某些操作、读取大部分资源等)
    • 完全访问(允许他们做任何他们通常会做的事情)
  • 如上所述,您需要做的是确定在哪些情况下您将为用户提供每个访问状态(例如):

    • 使用电子邮件令牌登录->受限访问
    • 密码->完全访问
    • 身份验证\u令牌->完全访问
    • omniauth->完全访问
    之后,您将需要在用户会话中保存此信息。这应该在对用户进行身份验证时进行,因为您将知道使用了什么策略对用户进行身份验证

  • 要知道用户是否可以执行某个操作,您需要两件事:知道用户可以做什么,以及当前的“访问状态”。根据这些,您将决定是否允许用户执行特定操作

    当用户无法执行某个操作并且以有限的访问权限登录时,您应该将其带到流中以验证其凭据。这个流程非常简单,几乎就像登录一样,但只需使用密码即可。一旦你验证了他的凭证,你就可以将他的授权升级为完全访问权限

  • 实施细节

  • 我建议您创建一个授权模型,它将表示我提到的“访问状态”。该模型必须在会话中序列化,因此您应该能够从简单结构构建它,并将其再次序列化到该结构中。最简单越好(布尔标志、数组或散列)。对于前面提到的例子,看起来布尔值可以完成这项工作

  • 关于实现细节,我建议您在诱惑回调后与典狱长一起实现

  • 您可以使用CanCan通过创建自己的功能来实现这一点,该功能将由授权实例和用户实例构建


  • 几个月前,我实施了一个非常类似的行为。我没有非常有趣的资源向您展示,但我可以解释一下您可以如何组织或思考要解决的问题

    说明

  • 对于您所述的问题,一旦您识别了一个用户,您可以为他提供两种不同的状态:

    • 访问受限(执行某些操作、读取大部分资源等)
    • 完全访问(允许他们做任何他们通常会做的事情)
  • 如上所述,您需要做的是确定在哪些情况下您将为用户提供每个访问状态(例如):

    • 使用电子邮件令牌登录->受限访问
    • 密码->完全访问
    • 身份验证\u令牌->完全访问
    • omniauth->完全访问
    之后,您将需要在用户会话中保存此信息。这应该在对用户进行身份验证时进行,因为您将知道使用了什么策略对用户进行身份验证

  • 要知道用户是否可以执行某个操作,您需要两件事:知道用户可以做什么,以及当前的“访问权限”