Odoo中文社区可以通过以下两个域名访问:shine-it.net , odoo.net.cn

由于系统升迁的原因,本论坛部分较早期的内容存在格式和链接损坏失效的问题,并非本论坛系统本身的缺陷,望谅解

本社区没有维护任何QQ群讨论组,任何与本社区同名的QQ群讨论组的言论与本社区无关!

开发人员可以登录gitter讨论组: http://gitter.im/odoo-china/Talk, 需要github账号

如果您登录系统碰到问题,请在微信公众号留言:

self.env.user 为什么总是指向超级用户?



  • 我在判断当前用户是否是创建人是,用到了self.env.user,但是不管用哪个用户,uid都指向admin,问题是我没有用admin账户,但又找不到问题所在,哪位大神指点一下?



  • 是不是前面有地方 sudo 了,

    另外看下 self._uid 或者 self._context 里面 uid 的值,

    如果uid 对的话,

    判断当前用户也可以不用 self.env.user,

    用 context 里的 uid,

    代码里有些地方会 sudo , 导致了 self.env 里的user 可能强行为 admin



  • 谢谢你,前边没有地方用sudo(),uid值也是超级用户的


  • 管理员

    把你的代码show一下吧




  • 管理员

    代码能贴全点吗?哪里调用了这个方法,这个方法对应的类定义?另外你用的Odoo的版本号?调试的打印结果是什么?



  • 背景是我添加了一个布尔类型的can_write计算字段,用于判断当前用户是否有权限填写某项目。这个方法在model中只有字段里compute处有调用,即:
    can_write = fields.Boolean(compute='_can_write', store=False, readonly=True)
    我用的odoo版本是11版的。
    没有报错信息,只是不能输入(即没有写如权限),即这个方法中,state in ['apply', 'partner']时,can_write判断为false,我print输出了self.env.user.employee_ids[0].id 和self.parent_id.id, 发现确实不一致,前者始终指向admin, 包括self.env.uid也是如此。


  • 管理员

    可以推断你这个计算字段是定义在hr.employee对象上的。

    你在elif的判断条件里有一个错误:
    self.env.user.employee_ids[0].id == self.parent_id
    应该是:
    self.env.user.employee_ids[0].id == self.parent_id.id

    self.env.user.employee_ids[0].id 和self.parent_id.id, 发现确实不一致,前者始终指向admin, 包括self.env.uid也是如此。

    好象得不出当前user总是root user的结论啊。前者是指self.env.user.employee_ids[0].id 吧?这个是employee的id

    另外,这样的判断在碰到没有关联Employee的用户时,系统直接就报错了。



  • 你说的elif里的错误已经改了,问题不出现在那,理论上self.env.user.employee_ids[0].id 确实应该指向当前登录用户的id,包括self.env.uid都应当指向当前登录用户的employee_id,但是print输出的全部为1,我的数据库里指向了admin;
    你说的情况确实可能存在,但当时测得时候,出问题的用户在hr_employee表中是有数据的,同一models表中其他位置获取到的居然是没有问题的。


  • 管理员

    @皓羽如风
    这么说吧,你几乎不必怀疑Odoo会把self.env.user会固定为root user,否则你就发现了一个天大的安全漏洞了。问题一定是在定制的部分。

    你没有完整贴你的定制代码,我们很难猜测。

    就是你贴出的那部分代码里还有问题(虽然跟你的超级用户的结论不一定相关):

    你的_can_write函数似乎只处理单例的情况。更合理的应该是放在一个循环里:

    for employee in self:
    
    


  • 看下 self._context 里 uid 的值,

    以及 self._uid 的值,

    不是 self.env 里面的uid


  • 管理员

    self._uidself.env.uid是一回事, 参见models.py

        _cr = property(lambda self: self.env.cr)
        _uid = property(lambda self: self.env.uid)
        _context = property(lambda self: self.env.context)
    

    他们默认的情况下跟session context中的uid都是当前登录用户, 但是我们是可以通过with_env方法来改变环境用户的, 比如:

    print(self.env.uid) --> 1
    self.with_env(self.env(user=5))
    print(self.env.uid) --> 5
    


  • @digitalsatori 这个我是了解的,我有在其他地方print输出测试过,所以了解。_can_write函数本身就是针对单例情况的,嗯,我考虑一下,看看怎么改合适。


Log in to reply