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

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

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