Ruby on rails Rails:如何防止未经授权访问控制器更新操作
您好,我是rails的新手,我正在尝试找出如何防止未经授权访问控制器的更新操作 我知道我可以有一个前文件管理器,它可以将未登录的用户踢出,我可以在Ruby on rails Rails:如何防止未经授权访问控制器更新操作,ruby-on-rails,ruby,ruby-on-rails-3,model-view-controller,Ruby On Rails,Ruby,Ruby On Rails 3,Model View Controller,您好,我是rails的新手,我正在尝试找出如何防止未经授权访问控制器的更新操作 我知道我可以有一个前文件管理器,它可以将未登录的用户踢出,我可以在edit操作中将重定向到,但我希望有一种方法可以阻止用户编辑不属于他们的对象 例如:授权用户只需在我的应用程序中更改作业对象,即可直接发送带有任何作业.id的请求作为参数,并更改他们想要的任何字段 这是我的控制器: def update @job = Job.find(params[:id]) @job.update_attri
edit
操作中将重定向到,但我希望有一种方法可以阻止用户编辑不属于他们的对象
例如:授权用户只需在我的应用程序中更改作业
对象,即可直接发送带有任何作业.id
的请求作为参数,并更改他们想要的任何字段
这是我的控制器:
def update
@job = Job.find(params[:id])
@job.update_attributes(params[:job])
redirect_to jobs_path
end
为了尝试解决这个问题,我尝试检查update
操作,如果用户得到授权,如果他们没有,我会将他们重定向到索引页
def update
@job = Job.find(params[:id])
if @job.user.id != current_login
redirect_to jobs_path
end
@job.update_attributes(params[:job])
redirect_to jobs_path
end
但当我尝试这样做时,rails给了我一个错误,告诉我在一个操作中只能有一个重定向
def update
@job = Job.find(params[:id])
@job.update_attributes(params[:job]) unless @job.user.id != current_login
redirect_to jobs_path
end
:)
:)您可以执行重定向到作业路径并返回
或返回重定向到作业路径
请尝试以下操作:
def update
@job = Job.find(params[:id])
if @job.user.id != current_login
redirect_to jobs_path and return
end
@job.update_attributes(params[:job])
redirect_to jobs_path and return
end
您可以执行重定向到作业路径并返回
或返回重定向到作业路径
请尝试以下操作:
def update
@job = Job.find(params[:id])
if @job.user.id != current_login
redirect_to jobs_path and return
end
@job.update_attributes(params[:job])
redirect_to jobs_path and return
end
这可能是因为在第一次重定向之后,第二次重定向仍然可以执行。
因此,将update\u属性
和第二个重定向
放入else路径(如下所示)应该可以解决问题:
def update
@job = Job.find(params[:id])
if @job.user.id != current_login
redirect_to jobs_path
else
@job.update_attributes(params[:job])
redirect_to jobs_path
end
end
这可能是因为在第一次重定向之后,第二次重定向仍然可以执行。
因此,将update\u属性
和第二个重定向
放入else路径(如下所示)应该可以解决问题:
def update
@job = Job.find(params[:id])
if @job.user.id != current_login
redirect_to jobs_path
else
@job.update_attributes(params[:job])
redirect_to jobs_path
end
end
使用Else子句
问题在于,该方法并没有结束当前的方法;它只是告诉控制器设置一些标题。为了防止这个问题,您需要确保控件不会“掉到”第二个重定向。一种方法是将您的替代路径放入else子句中。例如:
def update
@job = Job.find(params[:id])
if @job.user.id != current_login
redirect_to jobs_path
else
@job.update_attributes(params[:job])
redirect_to jobs_path
end
end
使用Else子句
问题在于,该方法并没有结束当前的方法;它只是告诉控制器设置一些标题。为了防止这个问题,您需要确保控件不会“掉到”第二个重定向。一种方法是将您的替代路径放入else子句中。例如:
def update
@job = Job.find(params[:id])
if @job.user.id != current_login
redirect_to jobs_path
else
@job.update_attributes(params[:job])
redirect_to jobs_path
end
end
好的,解决您眼前问题的简单方法是使用流控制,以确保在单个请求上只到达一个重定向到,正如许多其他人所建议的那样
然而,这并不是我解决你更大问题的方法
首先,有很多用于管理授权的现有解决方案,例如或。我会调查的
其次,正如您所建议的,我会使用before_filter
来阻止访问。比如:
before_filter :load_job, :only => [:show, :edit, :update, :delete]
before_filter :require_authorization, :only => [:edit, :update, :delete]
def load_job
@job = Job.find(params[:id])
end
def require_authorization
redirect_to jobs_path unless current_user.can_edit?(@job) # or whatever you want to check
end
before过滤器将按顺序执行,因此在您检查权限时,用户和作业已经可用,并且可以检查该特定作业的权限。好的,解决当前问题的简单方法是使用流控制,以确保在单个请求中只到达一个重定向到
,正如许多其他人所建议的那样
然而,这并不是我解决你更大问题的方法
首先,有很多用于管理授权的现有解决方案,例如或。我会调查的
其次,正如您所建议的,我会使用before_filter
来阻止访问。比如:
before_filter :load_job, :only => [:show, :edit, :update, :delete]
before_filter :require_authorization, :only => [:edit, :update, :delete]
def load_job
@job = Job.find(params[:id])
end
def require_authorization
redirect_to jobs_path unless current_user.can_edit?(@job) # or whatever you want to check
end
before过滤器将按顺序执行,因此当您检查权限时,用户和作业已经可用,并且可以检查该特定作业的权限