为什么这些规则在 Odoo 11 中有这种行为?

Why do these rules have this behaviour in Odoo 11?

一如既往,规则有问题。我以为我终于理解了他们,但不是。

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

代码

他们创建了三个组:

他们为以下模型提供了对组的访问权限:

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>

行为

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

我认为这个案例如何运作

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

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

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

您的问题:

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

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

  • A: **根据你的model access,两个组都有read access,没有record rules限制read access。

    怎么做!?为什么!!!?

    1. 第一个规则 hr_attendance_rule_attendance_manager,根据对组的 readwritecreateunlink 访问进行评估hr_attendance.group_hr_attendance_user。 (没有提供明确的评估 peams,默认设置为 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。

备注

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

希望对您有所帮助