跳转至内容
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(Flatly)
  • 不使用皮肤
折叠

Odoo 中文社区

  1. 主页
  2. 版块
  3. Odoo 开发与实施交流
  4. self.env.user 为什么总是指向超级用户?

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

已定时 已固定 已锁定 已移动 Odoo 开发与实施交流
13 帖子 3 发布者 2.8k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • digitalsatoriD 离线
    digitalsatoriD 离线
    digitalsatori 管理员
    写于 最后由 编辑
    #4

    把你的代码show一下吧

    【上海先安科技】(tony AT openerp.cn)

    皓 1 条回复 最后回复
    0
    • 皓 离线
      皓 离线
      皓羽如风
      在 回复了 digitalsatori 最后由 编辑
      #5

      @digitalsatori 0_1532586491915_uid问题.png

      1 条回复 最后回复
      0
      • digitalsatoriD 离线
        digitalsatoriD 离线
        digitalsatori 管理员
        写于 最后由 编辑
        #6

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

        【上海先安科技】(tony AT openerp.cn)

        1 条回复 最后回复
        0
        • 皓 离线
          皓 离线
          皓羽如风
          写于 最后由 皓羽如风 编辑
          #7

          背景是我添加了一个布尔类型的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也是如此。

          1 条回复 最后回复
          0
          • digitalsatoriD 离线
            digitalsatoriD 离线
            digitalsatori 管理员
            写于 最后由 digitalsatori 编辑
            #8

            可以推断你这个计算字段是定义在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的用户时,系统直接就报错了。

            【上海先安科技】(tony AT openerp.cn)

            1 条回复 最后回复
            0
            • 皓 离线
              皓 离线
              皓羽如风
              写于 最后由 编辑
              #9

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

              1 条回复 最后回复
              0
              • digitalsatoriD 离线
                digitalsatoriD 离线
                digitalsatori 管理员
                写于 最后由 编辑
                #10

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

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

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

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

                for employee in self:
                
                

                【上海先安科技】(tony AT openerp.cn)

                皓 1 条回复 最后回复
                0
                • S 离线
                  S 离线
                  Siyuan
                  写于 最后由 编辑
                  #11

                  看下 self._context 里 uid 的值,

                  以及 self._uid 的值,

                  不是 self.env 里面的uid

                  1 条回复 最后回复
                  0
                  • digitalsatoriD 离线
                    digitalsatoriD 离线
                    digitalsatori 管理员
                    写于 最后由 digitalsatori 编辑
                    #12

                    self._uid和self.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
                    

                    【上海先安科技】(tony AT openerp.cn)

                    1 条回复 最后回复
                    0
                    • 皓 离线
                      皓 离线
                      皓羽如风
                      在 回复了 digitalsatori 最后由 编辑
                      #13

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

                      1 条回复 最后回复
                      0

                      • 登录

                      • 没有帐号? 注册

                      • 登录或注册以进行搜索。
                      • 第一个帖子
                        最后一个帖子
                      0
                      • 版块
                      • 标签
                      • 热门
                      • 用户
                      • 群组