【问题标题】:Authenticating a user after #create#create 之后对用户进行身份验证
【发布时间】:2010-10-21 21:08:33
【问题描述】:

这似乎不断出现在我的各种项目中,我想知道是否有人有一个很好的解决方案:

我们有一个带有 Authlogic 身份验证的 Rails 应用程序。最初,有一个漂亮、干净、RESTful ListingsController,它要求用户在发布/创建之前先登录:

before_filter :require_user, :only => [ :new, :create]

然而,在看到这个实际操作后,我们决定我们需要尝试不同的流程,未注册用户可以先填写列表的表单,然后提示注册/登录。如果他们放弃注册,我们不需要创建列表。如果他们进行身份验证,我们希望像往常一样将列表与 current_user 连接起来。

几个可能的障碍:

  1. 新的列表表单允许用户上传我们使用 Paperclip 存储的文件。
  2. 身份验证可能通过一系列针对 facebook 或 twitter 的重定向进行。

我觉得这种身份验证创建后场景很常见,以至于会有一些关于攻击它的标准方法的资源,但我并没有真正找到太多。有人对此有很好的解决方案或资源吗?

谢谢!

【问题讨论】:

    标签: ruby-on-rails authlogic devise


    【解决方案1】:

    一种解决方案是生成一个唯一令牌并将其存储在您的模型中(例如 Listing.pending_id),然后将相同的令牌写入 cookie。稍后,当客户端首次通过身份验证时,您会检查“pending_id”cookie 并将其链接到相关列表(如果找到)。

    您必须安排一项任务以删除任何早于 (x) 的未完成列表,并确保将所有待处理列表排除在正常操作(搜索、列表等)之外。根据您的应用程序,您最好创建一个单独的 PendingListing 模型和数据库表。

    这种方法的一个缺点是,如果在一台计算机/浏览器上添加列表,但在另一台计算机/浏览器上进行身份验证,则无法恢复列表。

    【讨论】:

    • 感谢您的回答。所以我需要对几个模型执行此操作,并且我想避免在数据库中复制所有这些表。我想要一个可以为所有需要它的模型/控制器简化的解决方案。我正在考虑类似于 pending_id 解决方案的东西......我想 user_id 需要设为可为空,或者可能存在待处理记录将引用的“匿名”用户。然后,主要是过滤掉待处理的列表。我会使用 default_scope 将它们过滤掉,但过去确实让我很头疼......
    • 好吧,如果您的模型上的#create 过程倾向于坚持使用 Model.create(params[:model]) 方法,那么您可以使用 pending_params、pending_id 和所有可能的方法创建 PendingAsset 模型回形针附件/其他抽象行为,将您的 params[:model] 哈希作为 JSON 存储在 PendingAsset.pending_params 中,当用户稍后通过身份验证时,将参数拉出并构建真实实例。在这种情况下,您不需要使用 default_scope。为了奖励 DRYing,您可以添加帮助程序来处理存储和检索待处理模型。
    • 我喜欢它......也许它甚至可以被抽象为未来项目的有用插件/宝石。我会试一试,看看它的样子。谢谢!
    • 听起来很棒,编码愉快!如果您这样做,请务必在此处发布任何未来信息(或 github 链接!)。
    猜你喜欢
    • 2013-03-11
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2020-10-30
    • 2019-12-21
    • 2019-05-15
    相关资源
    最近更新 更多