Ruby on rails 从路由引用当前用户时的RESTful路由最佳实践?

Ruby on rails 从路由引用当前用户时的RESTful路由最佳实践?,ruby-on-rails,rest,Ruby On Rails,Rest,我为用户提供了典型的RESTful路由: /user/:id /user/:id/edit /user/:id/newsfeed 但是,只有当id等于当前用户的id时,才能访问/user/:id/edit路由。因为我只希望当前用户有权编辑其配置文件。我不希望其他用户能够编辑不属于他们的配置文件 处理这种情况的最佳做法通常是什么 如果current_user.id!=param[:id],强制调用api的前端客户端跟踪登录用户的id 我是否应该创建一个特殊的路由/user/self/edit,并

我为用户提供了典型的RESTful路由:

/user/:id
/user/:id/edit
/user/:id/newsfeed
但是,只有当id等于当前用户的id时,才能访问
/user/:id/edit
路由。因为我只希望当前用户有权编辑其配置文件。我不希望其他用户能够编辑不属于他们的配置文件

处理这种情况的最佳做法通常是什么

如果
current_user.id!=param[:id]
,强制调用api的前端客户端跟踪登录用户的id


我是否应该创建一个特殊的路由
/user/self/edit
,并在控制器中检查
参数[:id]=“self”

您应该使用此路由:

PUT /user/me
请注意,不需要“编辑”:您应该使用
PUT
方法

另外,您应该明确定义我上面写的路由,而不是检查
id==“self”

我只希望当前用户有权编辑其配置文件。我 不希望其他用户能够编辑不属于您的配置文件 他们

我建议使用一些授权宝石

示例代码:


同样,使用身份验证gem类似,只有
当前用户(登录的用户)才能访问和编辑他们的配置文件您应该保持url的原样。身份验证和授权是两个独立的问题。”“当前用户”是指经过身份验证可以访问API的用户。url中的id标识“当前用户”正在使用的资源,因此他是否有权访问该资源是授权的问题。因此,您应该添加
current_user.id!=参数[:id]
(如您所述),并抛出403状态代码作为响应。

我会为当前用户配置文件操作添加特殊路由,在这种情况下,您无需检查任何内容。只需加载并显示当前用户的数据。例如:

/my-profile/edit
/my-profile/newsfeed
它不是RESTful的,但是您不必进行额外的检查来保持代码的整洁


如果您仍然需要(或想要)一个严格的RESTful路由,那么我将使用before\u过滤器并检查id是否=current\u user.id。如果没有,那么返回401或403。

我想说你做得正确,只需保持当前路线不变即可。您应该做的是在控制器中添加一个限制。我假设您使用的是Rails,并且使用的是用户和控制器

class UsersController < ApplicationController::Base
  def edit
    if current_user.id == params[:id]
      # do your work
    else
      render :404
    end
  end
end
class UsersController
或者,您可以通过将限制移到回调中来清理控制器:

class UsersController < ApplicationController::Base
  before_filter :restrict_user, only: [:edit]

  def edit
    # do your work
  end

  private
  def restrict_user
    render :404 unless current_user.id == params[:id]
  end
end
class UsersController
您可以在初始化后添加
gem“cancancan”

    class Ability
        include CanCan::Ability

        def initialize(user)

            can :update, User do |user|
                 user.id == params[:id]
            end
        end
    end

然后添加此
授权!:编辑,@user
到您的更新操作中

您需要在所有user\u controller方法中添加授权代码,这是另一条建议。通常,我在应用程序中所做的是,用户只需编辑自己的配置文件,我会为用户添加一个/profile路由来编辑自己的配置文件,然后在主/users/:id/*路由上添加逻辑以防止非管理员用户访问这些路由。

用户可以查看其配置文件
/users/1
或编辑其配置文件
/users/1/编辑
。从用户的角度来看,这个URL是绝对好的

没有可能导致用户编辑其他用户的链接。您试图涵盖不同的情况:当有人试图手工创建URL并访问另一个帐户时。我不会称他们为黑客,但从技术上讲他们是——试图利用你的网站通过限制的用户

你不必担心“黑客”的便利性。我总是在
edit
操作中使用
current\u user
,这样任何人都不能编辑错误的个人资料,不管他的个人资料是什么

def edit
  @user = current_user
end

另外,我需要提到的是,您还应该使用此类检查来涵盖
update
操作。使用
edit
时,您可能只能获取数据(并且可能只能获取完全公开的数据,除非您将账单信息或纯文本密码放入
edit
模板中)。但是使用
update
您实际上可以更改数据,这可能更具破坏性。

因为您只关心为当前经过身份验证的用户提供RESTful端点,该端点在您的控制器中作为
current\u user
提供,所以我说您不需要
id
标识符参数。我建议采用以下方法:

GET /user => users#show
PUT/PATCH /user => users#update
GET /user/edit => users#edit

因为看起来唯一可用的用户资源应该是经过身份验证的用户,所以我认为解决这个问题的最好方法是

GET /user
PUT /user
GET /user/newsfeed
如果您希望在将来扩展api的使用,以便一个用户可以访问其他用户资源,那么您需要一个包含用户ID的解决方案。在这里,引入“自我”的路线也是有意义的。但是,您还必须在服务器端实现访问检查

GET /user/id/:id
PUT /user/id/:id
GET /user/id/:id/newsfeed

GET /user/self
PUT /user/self
GET /user/self/newsfeed
但我认为你应该尽可能简单


为了进一步的研究,我会提出一些类似于API设计的介绍书,很好地,你可以考虑<代码> /Prime<代码>作为资源,我甚至可以把第二个URL重命名为<代码> /NeXPotos/Cuff>。这是当前用户的新闻提要。rails的标准方法是在before\u filter/before\u action中检查当前用户的id,或者根据当前用户执行接受的anwer和load资源
GET /user/id/:id
PUT /user/id/:id
GET /user/id/:id/newsfeed

GET /user/self
PUT /user/self
GET /user/self/newsfeed