前言:我正在使用设计进行身份验证。
我试图阻止未经授权的用户查看、编辑或更新其他用户的信息。我最担心的是用户将 DOM 中的表单修改为另一个用户的 ID,填写表单,然后单击更新。我已经在 SO 上专门阅读过类似下面的内容应该可以工作,但事实并非如此。SO 上的一篇文章建议将该validate_current_user
方法移至公共领域,但这也不起作用。
有什么明显的我做错了吗?或者是否有更好的方法来解决我正在尝试做的事情,无论是使用设计还是其他东西?
我的UsersController
样子是这样的:
class UsersController < ApplicationController
before_filter :authenticate_admin!, :only => [:new, :create, :destroy]
before_filter :redirect_guests
def index
redirect_to current_user unless current_user.try(:admin?)
if params[:approved] == "false"
@users = User.find_all_by_approved(false)
else
@users = User.all
end
end
def show
@user = User.find(params[:id])
validate_current_user
@user
end
def new
@user = User.new
end
def edit
@user = User.find(params[:id])
validate_current_user
@user
end
def create
@user = User.new(params[:user])
respond_to do |format|
if @user.save
format.html { redirect_to @user, :notice => 'User was successfully created.' }
else
format.html { render :action => "new" }
end
end
end
def update
@user = User.find(params[:id])
validate_current_user
respond_to do |format|
if @user.update_attributes(params[:user])
format.html { redirect_to @user, :notice => 'User was successfully updated.' }
else
format.html { render :action => "edit" }
end
end
end
private
def redirect_guests
redirect_to new_user_session_path if current_user.nil?
end
def validate_current_user
if current_user && current_user != @user && !current_user.try(:admin?)
return redirect_to(current_user)
end
end
end
该authenticate_admin!
方法如下所示:
def authenticate_admin!
return redirect_to new_user_session_path if current_user.nil?
unless current_user.try(:admin?)
flash[:error] = "Unauthorized access!"
redirect_to root_path
end
end
编辑 —— 你是什么意思“它不起作用?”
为了帮助澄清,当我尝试“破解”另一个用户的帐户时出现此错误:
在此操作中多次调用渲染和/或重定向。请注意,您只能调用渲染或重定向,并且每个操作最多调用一次。另请注意,重定向和渲染都不会终止操作的执行,因此如果您想在重定向后退出操作,则需要执行“redirect_to(...) and return”之类的操作。
如果我将方法代码内联在各个控制器操作中,它们确实可以工作。但是,我不想这样做,因为它不干。
我还应该指定我已经尝试过:
def validate_current_user
if current_user && current_user != @user && !current_user.try(:admin?)
redirect_to(current_user) and return
end
end