跳转至内容
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • 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.9k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • S 离线
    S 离线
    Siyuan
    写于 最后由 编辑
    #2

    是不是前面有地方 sudo 了,

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

    如果uid 对的话,

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

    用 context 里的 uid,

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

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

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

      1 条回复 最后回复
      0
      • 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
                          • 版块
                          • 标签
                          • 热门
                          • 用户
                          • 群组