【发布时间】:2019-11-06 16:11:24
【问题描述】:
下面描述的问题在 Odoo 12 CE 上遇到过。
在创建数据库时创建的默认管理员是管理员/设置类型。为简单起见,我们将其命名为 User1。用户 1 创建用户 2。 User1 将管理员/访问权限授予 User2。现在 User2 能够:
删除用户 1 ?!?!
自我提升为管理员/设置 ?!?!
我们如何防止 User2 执行上述两项操作,从而保护 User1?
提前感谢您的任何建议。
【问题讨论】:
标签: odoo
下面描述的问题在 Odoo 12 CE 上遇到过。
在创建数据库时创建的默认管理员是管理员/设置类型。为简单起见,我们将其命名为 User1。用户 1 创建用户 2。 User1 将管理员/访问权限授予 User2。现在 User2 能够:
删除用户 1 ?!?!
自我提升为管理员/设置 ?!?!
我们如何防止 User2 执行上述两项操作,从而保护 User1?
提前感谢您的任何建议。
【问题讨论】:
标签: odoo
这是个好问题。 superuser(或您所称的 Administrator 或 User1)仅针对激活/停用和删除进行保护。但是,您可以从superuser 的权限中删除Administrator/Access Rights。
我们可以看到为保护12.0/odoo/addons/base/models/res_users.py(Users 类)中的superuser 所做的工作:
编辑记录方法:
@api.multi
def write(self, values):
if values.get('active') and SUPERUSER_ID in self._ids:
raise UserError(_("You cannot activate the superuser."))
if values.get('active') == False and self._uid in self._ids:
raise UserError(_("You cannot deactivate the user you're currently logged in as."))
...
删除记录方法:
@api.multi
def unlink(self):
if SUPERUSER_ID in self.ids:
raise UserError(_('You can not remove the admin user as it is used internally for resources created by Odoo (updates, module installation, ...)'))
db = self._cr.dbname
for id in self.ids:
self.__uid_cache[db].pop(id, None)
self._invalidate_session_cache()
return super(Users, self).unlink()
我们可以做些什么来进一步保护?:
为了防止任何人(除了superuser它自己)触摸superuser,您可以在Users类的write方法的开头添加以下代码(在前面提到的路径中):
if SUPERUSER_ID in self.ids and self._uid != SUPERUSER_ID :
raise UserError(_('You can not edit the admin!'))
【讨论】: