Rails + Devise:如何限制用户编辑不属于他的记录

时间:2012-10-01 01:49:29

标签: ruby-on-rails ruby-on-rails-3 devise

我正在使用Rails,Devise和Mongoid。

用户只能拥有一个项目(has_one :profile),但所有用户(以及未经过身份验证的用户)都可以看到项目列表(我有这个工作)。当用户登录时,他们会看到项目旁边的“编辑和删除”按钮(通过在<% if user_signed_in? %>中包裹这些按钮)。但是,登录用户会在所有项目旁边看到这些按钮,并且可以编辑或删除它们。

如何限制登录用户只能编辑他的项目?

作为奖励,是否可以在属于登录用户的项目周围显示特定内容或html(例如“这是您的项目”的文本或项目的html附近的其他类)?

2 个答案:

答案 0 :(得分:6)

当多个用户能够修改相同的资源时,CanCan非常棒,您需要跟踪谁拥有哪些权限。但是,如果严格的情况是只有拥有该项目的用户才能对其进行修改,那么CanCan可能有点过分。

按照iouri的建议隐藏视图中的链接,然后在控制器中执行以下操作:

def edit
  if current_user != @project.user
    # Redirect them to an error page
  else
    # Render the view
  end
end

更好的是,创建一个方法,如:

def user_owns_project?
  @project.user == current_user
end

然后设置一个前置过滤器进行编辑,更新和销毁,以便在用户不拥有项目的情况下重定向到错误页面。

编辑:您之前的过滤器也需要找到该项目并设置@project。 CanCan也可以使用load_and_authorize_resource为您处理此问题,但除非您需要或期望需要细粒度的权限控制,否则我仍然会避免使用它。

答案 1 :(得分:2)

设计是控制“身份验证”,这不应该是你的责任。

您希望控制“授权”,因为CanCan更好。