Rails 3限制访问权限,因此用户只能更新其数据

Xax*_*xum 6 controller ruby-on-rails-3

这似乎应该相当简单,因为它需要很多.我检查用户是否登录正常,但一旦用户登录,他们可能会改变其他人的帐户.例如:说ID为1的用户已登录,他们将/ users/2/edit作为url.这将向他们显示用户2s数据并允许他们修改它.当然我可以改变控制器中的编辑动作来使用这样的东西......

  def edit
    @user = User.find(current_user.id)
  end
Run Code Online (Sandbox Code Playgroud)

其中current_user在控制器中设置,所以用户总是那个登录的人.如果你只有几个控制器有几个动作,这很好,但如果你有很多,可能会很痛苦.似乎应该有一种方法来全局限制,因此用户只能更新自己的数据,无论他们使用什么操作或控制器.

有没有办法将用户限制为所有操作的数据?

His*_*alv 8

在您的application_controller.rb中,您可以尝试这样做:

class ApplicationController < ActionController::Base
  before_filter :validate_user

  private

  def validate_user() #might need to pass id and current_user
    if current_user.id == params[:id]
      # continue to current_user url
    else
        flash[:error] = "Please access one of your own pages"
        redirect_to(:back)
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

通过将这些东西放在应用程序控制器中,它应该在所有控制器中可用,但是如果您不需要确认这是当前用户(比如可能是主页)那么您可能需要在任何特定控制器中使用skip_before_filter(对于需要它的特定操作),例如在页面控制器中

class PagesController < ApplicationController
  skip_before_filter :validate_user, :only => [:home, :about]
end
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请查看此链接到过滤器上的rails指南.也可以有更有效的方法来实现这一目标.

希望能帮助到你


pdu*_*uey 4

我认为你的问题实际上是关于如何进行授权。另外,我怀疑您可能会将“belongs_to”模型关联名称与授权混为一谈。“belongs_to”关联名称描述了一个模型如何与另一个模型相关,但它并不暗示应用程序如何控制对任何模型的访问。

Hishalv 是正确的,使用控制器过滤器是管理授权的正确方法。这是正确的 MVC 方式。仔细阅读Rails 指南,以便您理解这一点。

然后,您可以考虑使用像 CanCan 这样的授权 gem,或者根据 Hishalv 的建议推出您自己的 gem。CanCan 与像 Devise 这样的身份验证gem配合使用效果很好。如果您确实要自己开发,那么在 ApplicationController 中放置一个辅助方法并以无论模型如何都可以工作的方式编写它是一件简单的事情。