从路由引用current_user时的RESTful路由最佳实践?

ste*_*eve 18 rest ruby-on-rails

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

/user/:id
/user/:id/edit
/user/:id/newsfeed
Run Code Online (Sandbox Code Playgroud)

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

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

我应该按原样离开路由,并且如果current_user.id != param[:id]强制前端客户端调用api跟踪登录用户的id,则会出错?

我应该制作一条特殊路线/user/self/edit并在控制器中检查是否param[:id] == 'self'?

evg*_*hev 13

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

/my-profile/edit
/my-profile/newsfeed
Run Code Online (Sandbox Code Playgroud)

这不是RESTful,但您不必进行额外的检查以保持代码清洁.

如果您仍然必须拥有(或想拥有)严格的RESTful路由,那么我将使用before_filter并检查id = current_user.id.如果没有,则返回401或403.


Pav*_*van 5

我只希望current_user有权编辑其个人资料.我不希望其他用户能够编辑不属于他们的配置文件.

我建议使用像权威这样的授权宝石

示例代码:

class UserPolicy
  attr_reader :current_user, :model

  def initialize(current_user, model)
    @current_user = current_user
    @user = model
  end

  def edit?
    @current_user == @user
  end
end
Run Code Online (Sandbox Code Playgroud)

此外,对于像Devise这样的身份验证gem,只有(登录的用户)才能访问和编辑他们的配置文件current_user