2

我正在使用 Rails、Devise 和 Mongoid。

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

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

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

4

2 回答 2

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,但除非您需要或期望需要细粒度的权限控制,否则我仍然会避免使用它。

于 2012-10-01T22:58:44.037 回答
2

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

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

于 2012-10-01T22:42:04.600 回答