检查current_user是否是资源的所有者并允许编辑/删除操作

spa*_*kle 13 activerecord ruby-on-rails devise ruby-on-rails-4

例:

用户A(id = 10)已创建照片资源

photo: (id: 1 user_id = 10, url: "http://...")
Run Code Online (Sandbox Code Playgroud)

现在,如果用户B(id = 20)转到此网址:/photos/1/edit它可以编辑用户A的照片!

Rails + Devise默认为此提供了一些东西?这似乎是一个非常普遍的问题

我只需要允许任何用户只能编辑/删除它创建的资源(其中current_user == resource.user)

使用: Rails 4,设计

更新:

我认为CanCan太先进了.我不需要角色或限制某些用户的某些操作

Ere*_*bih 33

在你的PhotosController中:

before_filter :require_permission, only: :edit

def require_permission
  if current_user != Photo.find(params[:id]).user
    redirect_to root_path
    #Or do something else here
  end
end
Run Code Online (Sandbox Code Playgroud)


Dan*_*sch 14

您可以使用Rails的关联并将其写为:

def edit
  @photo = current_user.photos.find(params[:id])

  # ... do everything else
end
Run Code Online (Sandbox Code Playgroud)

这只会在具有提供的ID的照片属于当前用户时找到记录.如果没有,Rails将引发ActiveRecord::RecordNotFound异常.

当然,我假设该current_user方法可用,并且您的User模型包含该语句has_many :photos.

  • 对于这个简单的问题,这是最优雅的解决方案.+1 (2认同)