带有身份验证的 Rails Web 服务???用户登录??

Posted

技术标签:

【中文标题】带有身份验证的 Rails Web 服务???用户登录??【英文标题】:Rails Web service with authentication??? User logged in ?? 【发布时间】:2011-05-08 05:30:16 【问题描述】:

知道我将如何拥有一个 Rails REST Web 服务,其中用户只能获取、放置、发布、删除他们自己的数据?我使用 Devise 作为我的用户身份验证 gem,但我不确定这是否以 RESTful 方式处理事情。

我如何确保用户已“登录”并且可以更改他们的数据?我是否必须在每个请求中传递某种令牌??

【问题讨论】:

【参考方案1】:

Devise 只会为您提供身份验证。这意味着您可以确定用户已被识别并且他/她所说的他/她是谁。有了这些信息,您可以使用 Rails 机制或其他 Rails gem(即 CanCan、Aegis、declarative_authorization)来授权用户并定义权限。

一种简单的方法是在您的控制器上使用before_filter,以确定BlogPost 是否属于已登录的用户。

这里有一个简单的例子来说明我的意思:

class BlogPostsController < ApplicationController
  before_filter :is_user_allowed, :only => [:edit, :delete, :show]

  # default Rails generated RESTful methods here    

  def is_user_allowed
    if BlogPost.find(params[:id]).try(:user_id) != current_user.id
      redirect_to access_denied_page_path
    end
  end
end

is_user_allowed 方法检索正在查询的BlogPost,并通过比较用户ID 来确定是否允许current_user 执行操作。如果不等式为真,那么它会重定向到我们臭名昭著的access_denied_page_path

有关过滤器的更多信息,请参阅Edge Guides article。

有关可为您提供此功能(以及更多)的 Rails gems 的更多信息,请在 Google 上浏览并搜索 rails authorization。此外,这里有一些 Railscasts 应该提供一些见解:

192 - Authorization with CanCan 188 - Declarative Authorization

【讨论】:

这部分在通过有会话数据的网络浏览器登录时很好。如果我要尝试通过 curl 调用执行受限方法。这无法处理它,因为我实际上正在尝试使用 REST API。所以我看到了两种方法,一种是使用基本的 http 身份验证,另一种是使用 API 密钥来识别特定用户。对我来说,这两种方式的安全性似乎都很弱:(【参考方案2】:

看看AuthLogic'ssingle_access_token。它是为验证 REST API 而设计的。

【讨论】:

以上是关于带有身份验证的 Rails Web 服务???用户登录??的主要内容,如果未能解决你的问题,请参考以下文章

Rails Routes:带有身份验证块的更清晰的 if 语句

带有基本身份验证的 iOS swift Web 服务调用

Nodejs Express 用于 Web 应用程序 JWT,带有数据库或会话以验证用户身份

使用带有摘要身份验证、jquery ajax 调用的 RestFul PHP Web 服务

如何在2个服务器之间进行通用认证--Rails和Django

带有rails 3应用程序的ios json身份验证