Ruby on rails 防止用户使自己成为管理员

Ruby on rails 防止用户使自己成为管理员,ruby-on-rails,security,controller,Ruby On Rails,Security,Controller,在我的应用程序中,我有一个“用户”模型,其中包括许多属性,包括“has_admin_rights”。如果为true,则用户是管理员;如果为false,则用户不是管理员 每个用户都有一个个人资料,包括他们的登录名、电子邮件地址、个人资料图片等 如果我以普通用户身份登录,我可以点击一个名为“个人资料”的页面,我可以编辑自己的帐户,例如更新我的电子邮件地址、个人资料图片、密码等等。我只能编辑我的帐户,而不能编辑其他帐户 如果我以管理员身份登录,我可以做更多的事情:例如,我可以让另一个用户成为管理员,或

在我的应用程序中,我有一个“用户”模型,其中包括许多属性,包括“has_admin_rights”。如果为true,则用户是管理员;如果为false,则用户不是管理员

每个用户都有一个个人资料,包括他们的登录名、电子邮件地址、个人资料图片等

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

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

现在,只有管理员可以访问出现“makeadmin”复选框的视图,但我觉得仅仅限制对视图的访问是不够的

我关心的是,既然任何用户都可以编辑他们自己的个人资料,那么有什么可以阻止用户提交自定义表单帖子,其中有“has_admin_rights”=>“1”参数在他们自己的帐户上,从而授予他们管理员访问权限

我的想法是,在用户控制器中,在对“has_admin_rights”字段应用任何更改之前,我需要检查以确保发出请求的用户当前是管理员,否则我将完全忽略该请求,并且不进行任何更改

在用户控制器中,在对“has_admin_rights”字段应用任何更改之前,我需要检查以确保发出请求的用户当前是管理员,否则我将完全忽略该请求,并且不进行任何更改

是的,没错。永远不要相信客户;记住,任何人都可以直接用Firebug或其他工具来调整页面


<>我也建议您考虑添加审计跟踪,每当一个管理员将另一个用户设置为管理员时,记录一些内容。也可以向特定组的所有管理员发送电子邮件,让他们知道管理员已创建(或权限已被撤销)。

在保存到执行此验证的用户模型之前添加一个。使用可通过批量分配设置的模型属性白名单

  class User < ActiveRecord::Base
    attr_accessible :has_admin_rights
  end
它也很有用

class User < ActiveRecord::Base

  attr_protected :is_admin

end
class用户
您已经回答了自己的问题。隐藏UI的某些部分从来不是一种安全措施,您必须始终检查实际传入的请求,并在当时确定是否允许它。或者甚至比完全忽略请求更好的方法是发出错误消息。你永远不知道什么时候它会有助于调试一个问题!这里的诀窍是,您还需要知道在操作修改用户对象之前,标志的状态是什么。也许您可以检查Rails中对象的“更改”状态;我不知道。所以,除了你的建议之外,我决定创建一个“管理活动”表,它将跟踪所有管理操作、更改、删除等,即使它与用户无关。对于某些操作(如用户更改),它还将触发电子邮件警报-这是一个完美的主意。谢谢!祝你好运当电话铃响的时候,你真的很欣赏审计日志,电话另一端有一个愤怒的人发誓说:“但是我已经好几个月没碰过那个页面了!”只是想再次表示感谢。我已经(1)添加了对管理员操作的审核,(2)成功阻止了非管理员用户对管理员访问权限的更改,(3)向我的测试套件添加了功能测试,以确保我从未遇到过此问题。干杯很高兴听到它-安全是一个可怕的话题,最好是相当偏执!Salil,
attr_protected
黑名单可能是更好的选择。他不希望每次添加用户属性时都修改可访问的
attr\u
白名单。
class User < ActiveRecord::Base

  attr_protected :is_admin

end