2010-01-27 27 views
1

我一直在使用authlogic,它工作得很好。有一两件事我注意到的是,作为一个黑客,我可以轻松地输入该地址:Rails安全性:重定向,如果不是current_user

本地主机:: 3000 /用户/ a_user_that_is_not_me /编辑

由于在编辑表单的形式为@user这是设置为current_user并且需要一个真实性标记,即使我试图为其他用户提供详细信息,我最终会更改自己的帐户而不是其他用户。

这很好,但我希望它能让这些黑客在他们看到表单之前就重定向。

我在users_controller尝试这样的:如果我在与其他用户的姓名地址类型,但尝试访问的编辑页面为当前用户,当我得到一个404错误

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 

重定向工作。

任何想法,为什么这是行不通的?

回答

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页面的...

+0

这似乎并没有工作。我收到错误“无法找到用户名为用户名=当前” 这与我之前得到的相似。 这可能是由于authlogic本身固有的东西,其中的URL出现为http:// localhost:3000/users/current/edit – 2010-01-27 22:43:11

+0

除非有名为'current'的用户,否则我不希望这样做。如果你想让'/ users/current'引用当前用户,你将不得不明确地处理这种情况('if params [:id] =='current'...')。您还需要将验证添加到“用户”模型,以便用户不能选择“当前”名称。 – 2010-01-27 23:08:51

+0

这似乎是通过authlogic gem自动设置的。我必须检查验证。 – 2010-01-27 23:20:59

3

如果你打算做这种事情很多,请查看授权插件,如authorization-san

授权与身份验证的不同之处在于身份验证正在登录,但授权与身份验证(或未验证)的用户执行操作的权限有关。

随着认证-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 } 
+0

看起来非常好,很简单。我会检查出来的! – 2010-01-28 00:40:29