我一直在使用authlogic,它的效果非常好。我注意到的一件事是,作为黑客,我可以轻松输入这个地址:
本地主机:: 3000 /用户/ a_user_that_is_not_me /编辑
由于编辑表单中的表单是针对@user设置为current_user并且需要真实性令牌,即使我尝试为其他用户输入详细信息,我最终也会更改自己的帐户而不是其他用户。
这很好,很好,但我希望这些黑客能够在看到表单之前重定向。
我在users_controller中尝试了这个:
def edit
if admin?
@user = params[:user]
elsif User.find_by_username(params[:id]) != current_user
@user = current_user
@not_user = User.find_by_username(params[:id])
redirect_to user_path(@not_user)
else
@user = current_user
end
end
如果我输入一个包含其他用户名的地址,但重定向有效,但在尝试访问当前用户的编辑页面时出现404错误。
为什么这不起作用的任何想法?
答案 0 :(得分:3)
如果您要做很多这样的事情,请查看authorization-san之类的授权插件。
授权与身份验证的不同之处在于身份验证正在登录,但授权与经过身份验证(或未经身份验证)的用户执行操作的权限相关。
使用authentication-san,您可以在控制器中使用以下代码定义此规则:
# this assumes you've got some way to set @user to the user you're looking up,
# e.g. in a before_filter
allow_access(:authenticated, :only => [:edit, :update]) { current_user == @user }
答案 1 :(得分:1)
如果当前用户是管理员,您似乎正在为字符串分配@user
。这更简单(不易出错):
def edit
u = User.find_by_username!(params[:id])
if admin? or current_user.username == params[:id]
@user = u
else
redirect_to user_path(u)
end
end
此外,您不想使用find_by_username!
(结尾处),以便在找不到用户时呈现404页面吗?我不确定你现在如何获得404页面......