0

假设我有以下场景

  1. 用户收到一封电子邮件,告诉她有一个新项目在等她
  2. 点击链接并能够确认或拒绝项目(跳过详细信息)
  3. 然后可以访问她所有项目的列表

诀窍是我希望在没有用户登录的情况下允许这一切发生,然后限制对网站其他部分的访问(比如将项目发送给另一个用户)

我怎么看是这样的:

  • 当用户单击链接时,她已登录但仅在第 1 层 - 只能访问确认/拒绝操作并只读到项目索引(即创建设计会话时)
  • 当用户想要访问网站的其他部分时,会显示登录页面
  • 当用户只需输入网址即可访问网站http://example.com并想要访问自己的帐户时,她会被要求登录。
  • 登录后会话被“提升”到允许完全访问的层级
  • 出于安全原因,在一段时间不活动后,会话被降级到第 1 层

我的灵感来自亚马逊的工作方式——您可以以只读方式访问帐户的大部分内容,但在执行任何可破坏的操作之前,您需要登录。

有没有人有这种方法的经验或者可以分享一些博客文章等?我没有在 SO 上找到任何东西,Google 大多返回了关于两因素身份验证的信息,但这里并非如此。我也了解电子邮件中的链接存在安全问题。

4

2 回答 2

2

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

描述

  1. 对于您陈述的问题,看起来一旦您确定了一个用户,您就可以给他两种不同的状态:

    • 访问受限(执行某些操作、阅读大部分资源等)
    • 完全访问权限(允许他们做他们通常会做的任何事情)。
  2. 话虽如此,您需要做的是弄清楚在哪些情况下您将为用户提供每种访问状态(例如):

    • 使用电子邮件令牌登录 -> 受限访问
    • 密码 -> 完全访问权限
    • authentication_token -> 完全访问
    • omn​​iauth -> 完全访问权限

    之后,您需要将此信息保存在用户会话中。这应该在用户通过身份验证的任何时候完成,因为您将知道使用什么策略来验证用户。

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

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

实施细节

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

  2. 关于实现细节,我建议您使用 Warden after_atuhentication 回调来实现这一点。

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

于 2013-08-20T22:14:43.540 回答
1

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

于 2013-08-20T11:56:24.333 回答