2010-07-05 81 views
2

在我的应用程序中,我有一个“用户”模型,其中包括一些属性,包括“has_admin_rights”。如果为true,则用户是管理员,如果为false,则不是。防止用户使自己的管理员

每个用户都有一个配置文件,用自己的登录名,电子邮件地址,个人资料相片等

如果我登录作为一个普通用户,我可以点击一个名为“个人资料”页面上,并我可以编辑自己的帐户,例如更新我的电子邮件地址,个人资料图片,密码,等等。我只能编辑我的帐户,而不能使用其他帐户。

如果我以管理员身份登录,我可以做更多:例如,我可以让另一个用户成为管理员,或拿走他们的管理员权限。

现在,只有管理员才能访问“make admin”复选框出现的视图,但我有一种感觉,仅仅限制对视图的访问是不够的。

我担心的是,因为任何用户都可以编辑他们自己的配置文件,那里有什么来阻止用户提交自定义表单帖子,其中包含他们的“has_admin_rights”=>“1”参数自己的帐户 - 从而授予他们自己的管理权限?

我在想的是,在用户控制器中,在对“has_admin_rights”字段应用任何更改之前,我需要检查以确保发出请求的用户当前是管理员 - 否则我会忽略完全要求,不作任何改变。

+3

你回答了你自己的问题。 UI的隐藏位不是安全措施,您必须始终检查实际进入的请求,并在此时确定是否允许该请求。 – 2010-07-05 14:57:24

+0

甚至比完全忽略请求更好的方法是发出错误消息。你永远不知道什么时候它可能有助于调试一个问题! – 2010-07-06 04:43:39

回答

2
在用户控制器

,应用任何更改为“has_admin_rights”领域,我需要检查,以确保发出请求的用户是当前管理员之前 - 否则我完全忽略请求,并没有变化。

是的,正好。永远不要相信客户;请记住,任何人都可以直接用Firebug或其他方式调整页面。

我还建议你考虑添加一个审计跟踪,并记录一些管理员让另一个用户进入管理员的行为。也许还可以发送电子邮件给特定组的所有管理员,让他们知道已创建管理员(或该权限已被撤销)。

+0

完美,谢谢。 – jefflunt 2010-07-05 15:12:57

+0

因此,除了您的建议之外,我决定创建一个“admin_activity”表,该表会跟踪所有管理员操作,更改,删除等,即使它不是用户相关的。 对于某些操作(如用户更改),它也会触发电子邮件警报 - 完美的想法。 – jefflunt 2010-07-05 15:40:01

+1

谢谢!祝你好运。当电话响起时,您真的很感激审计日志记录,另一端有一个愤怒的人发誓:“但是我几个月没有触及那个页面!” – Pointy 2010-07-05 15:52:37

0

在执行此验证的User模型中添加before_save。

+0

那么诀窍就是你还需要知道标志的状态*在动作修改用户对象之前。也许你可以检查Rails中对象的“更改”状态;我不知道。 – Pointy 2010-07-05 15:01:22

0

Ue的attr_accessible该模型属性的白名单,可以通过大规模分配设置

class User < ActiveRecord::Base 
    attr_accessible :has_admin_rights 
    end 

&在控制器

@user.has_admin_rights = current_user.is_admin? "1" : "0" 
+0

Salil,'attr_protected'黑名单可能是更好的选择。每次添加用户属性时,他都不想修改“attr_accessible”白名单。 – 2010-07-05 17:28:07

1

attr_protected是非常有用的,太

class User < ActiveRecord::Base 

    attr_protected :is_admin 

end 
相关问题