【问题标题】:Why do these rules have this behaviour in Odoo 11?为什么这些规则在 Odoo 11 中有这种行为?
【发布时间】:2019-11-27 06:02:31
【问题描述】:

与往常一样,规则存在问题。我以为我终于理解了它们,但没有。

我正在查看 Odoo 11 的模块 hr_attendance 中模型访问和规则的行为。

代码

他们创建了三个组:

  • group_hr_attendance人工考勤)。
  • group_hr_attendance_user (Officer):属于这个组意味着属于group_hr_attendance
  • group_hr_attendance_manager (Manager):属于这个组意味着属于group_hr_attendance_user

它们为组提供以下模型访问权限:

id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_hr_attendance_user,hr.attendance.user,model_hr_attendance,hr_attendance.group_hr_attendance_user,1,1,1,1
access_hr_attendance_system_user,hr.attendance.system.user,model_hr_attendance,base.group_user,1,1,1,0

他们正在设置对Officer和基本组Employee的访问权限。

他们应用以下规则:

 <record id="hr_attendance_rule_attendance_manager" model="ir.rule">
    <field name="name">attendance officer: full access</field>
    <field name="model_id" ref="model_hr_attendance"/>
    <field name="domain_force">[(1,'=',1)]</field>
    <field name="groups" eval="[(4,ref('hr_attendance.group_hr_attendance_user'))]"/>
</record>

<record id="hr_attendance_rule_attendance_employee" model="ir.rule">
    <field name="name">user: modify own attendance only</field>
    <field name="model_id" ref="model_hr_attendance"/>
    <field name="domain_force">[('employee_id.user_id','=',user.id)]</field>
    <field name="perm_read" eval="0"/>
    <field name="perm_write" eval="1"/>
    <field name="perm_create" eval="1"/>
    <field name="perm_unlink" eval="0"/>
    <field name="groups" eval="[(4,ref('base.group_user'))]"/>
</record>

行为

如果我使用属于手动考勤组的基本用户登录,我可以看到员工用户不是我的考勤,如果我打开并尝试修改它们,我会得到一个安全错误:(文档类型:考勤,操作:写).

我认为这个案例是如何运作的

我的用户属于 Manual Attendance 组:它没有模型访问权限,所以我有 CRUD 0 0 0 0(我无法创建、读取、更新或删除 hr_attendance 的任何记录模型)。但是我的用户(每个人)也属于 Employee 组,所以我也有 CRUD 1 1 1 0。由于模型访问是附加的,我可以创建、读取和更新 hr_attendance 的任何记录模型,但不删除。

之后,规则限制了 CRUD。非全局规则hr_attendance_rule_attendance_employee用户:仅修改自己的出勤率)正在影响我的用户:我的组应该可以访问与域匹配的记录。其他的不会。因此,我将无法与员工用户不是我的出勤人员进行交互。我在这里有两个疑问:

  • 为什么规则的读取值为 0?这不是破坏模型访问赋予我的读取权限吗?我认为全局或非全局规则限制了模型访问。

  • 为什么我可以读取员工用户不是我的记录?它们不符合规则,所以我应该看不到它们,不是吗?

【问题讨论】:

    标签: xml odoo odoo-11


    【解决方案1】:

    我认为您误解了记录规则perm_*,用于使记录规则适用或相反。

    您的问题:

    • 问:为什么规则的读取值为 0?这不是破坏了我的模型访问权限吗?
    • A:读取值设置为 0,以确保在用户发出读取请求时不会评估此规则。并且您并没有破坏模型访问赋予您的读取权限,如果读取值设置为 1,则可以说您正在缩小模型访问权限,从整个模型到仅通过强制域的记录。

    • 问:为什么我可以读取员工用户不是我的记录?它们不符合规则,所以我应该看不到它们,不是吗?

    • A:**根据您的模型访问权限,两个组都有读取权限,并且没有限制读取权限的记录规则。

      怎么样!?为什么!!!?

      1. 第一条规则hr_attendance_rule_attendance_manager,在readwritecreateunlink 访问组hr_attendance.group_hr_attendance_user 上进行评估。 (没有提供明确的评估结果,默认设置为 1)

      2. 第二条规则 hr_attendance_rule_attendance_employee 仅在 writecreate 访问(perm_write=1 和 perm_create=1)上评估,而不在 readunlink 访问(perm_read =0 和 perm_unlink=0)。

    所以

    您应该也可以取消链接:)。要获得您想要的结果,您需要将 perm_read 设置为 1,并且要强制取消链接访问的域,您还需要将 perm_unlink 设置为 1。

    注意

    当您有复杂的访问条件时,您可以为每个访问请求(读取、写入、创建和取消链接)使用单独的规则。

    希望对你有帮助

    【讨论】:

    • 非常感谢@Omer,很好的解释!对您的回答只有一个疑问:您说 您也应该能够取消链接 :),但如果 perm_unlink 中的规则为 0,我知道删除记录时会忽略规则,因此将考虑模型访问权限,并且删除时它的值为 0,所以我应该无法删除,是吗?我的意思是,如果模型访问将权限设置为 0,那么规则永远不能将其设置为 1,对吗?
    • 是的!你没事吧。我在这一点上错过了访问模型,我错误地认为它被设置为 1。如果它被设置为 1,你应该能够取消链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 2015-02-26
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    相关资源
    最近更新 更多