这似乎应该相当简单,因为它需要很多。我检查用户是否登录正常,但一旦用户登录,他们可能会改变其他人的帐户。例如:说ID为1的用户已登录,他们将/ users / 2 / edit作为url。这将向他们显示用户2s数据并允许他们修改它。当然我可以改变控制器中的编辑动作来使用这样的东西......
def edit
@user = User.find(current_user.id)
end
其中current_user在控制器中设置,因此用户始终是那个登录的人。如果你只有几个控制器有几个动作,这很好,但如果你有很多动作可能会很痛苦。似乎应该有一种方法可以全局限制,因此无论用户使用何种操作或控制器,用户都只能更新自己的数据。
有没有办法将用户限制为自己的所有操作数据?
答案 0 :(得分: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
通过将内容放入应用程序控制器中,它应该在所有控制器中可用,但是如果您不需要确认这是当前用户(比如可能是主页)那么您可能需要在任何控制器中使用skip_before_filter需要它的特定控制器(用于特定操作),例如页面控制器中的这个(例如
)class PagesController < ApplicationController
skip_before_filter :validate_user, :only => [:home, :about]
end
有关详情,请查看此link to rails guides on filters。也可以有更有效的方法来实现这一目标。
希望有所帮助
答案 1 :(得分:4)
我认为您的问题实际上是关于如何进行授权。此外,我怀疑您可能会将“belongs_to”模型关联名称与授权混为一谈。 “belongs_to”关联名称描述了一个模型与另一个模型的关系,但它并不暗示应用程序如何控制对任何模型的访问。
Hishalv是正确的,使用控制器过滤器是管理授权的正确方法。这是正确的MVC方式。给Rails Guide一个好的阅读,以便您理解。
然后,您可以考虑使用像CanCan这样的授权宝石,或根据Hishalv的建议滚动自己的宝石。 CanCan可以与像Devise这样的身份验证宝石一起使用。如果您自己动手,那么在ApplicationController中放置一个帮助器方法并以一种无论模型如何都可以工作的方式编写它是一件简单的事情。
答案 2 :(得分:1)
我一直觉得有点奇怪的是,当他们想要做的就是更新自己的帐户时,最终用户会接触到诸如/users/2/edit
之类的Rails“内部”。
所以我更喜欢调用它的方法
resource :account
而不是
resources :users
然后你有/account
,/account/edit
等路径,只需处理登录用户的数据。
答案 3 :(得分:0)
如果您正在使用cancan,那么
def validate_user
unless current_user.id == params[:id].to_i
raise CanCan::AccessDenied
end
end
在application_controller中写
rescue_from CanCan::AccessDenied do |exception|
flash[:error] = "Access denied."
redirect_to access_denied_path
end