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

时间:2019-07-18 10:14:10

标签: xml odoo odoo-11

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

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

代码

他们创建了三个组:

  • group_hr_attendance人工出勤)。
  • group_hr_attendance_user Officer ):属于该组意味着属于group_hr_attendance
  • group_hr_attendance_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>

行为

如果我使用属于人工出勤组的基本用户登录,我会看到其雇员的用户不是我的出勤,如果我打开并尝试修改他们,我会得到一个安全错误:(文档类型:出勤,操作:写入)

我如何考虑这种情况

我的用户属于手动出勤组:它没有模型访问权限,所以我拥有CRUD 0 0 0 0(我无法创建,读取,更新或删除{{1 }}模型。但是我的用户(和所有人一样)也属于 Employee 组,因此我也拥有CRUD 1 1 10。由于模型访问是累加的,因此我可以创建,读取和更新{{1 }}模型,但不能删除。

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

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

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

1 个答案:

答案 0 :(得分:2)

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

您的问题:

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

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

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

    如何!?为什么!?

    1. 第一个规则hr_attendance_rule_attendance_manager在访问组{{1}的readwritecreateunlink上进行评估}。 (未提供任何明确的评估结果,默认情况下设置为1)

    2. 第二条规则hr_attendance.group_hr_attendance_user仅在hr_attendance_rule_attendance_employeewrite访问(perm_write = 1和perm_create = 1)上评估,而在{{1} }和create访问(perm_read = 0和perm_unlink = 0)。

所以

您还应该可以取消链接:)。要获得所需的结果,您需要将read设置为1,并强制域进行取消链接访问,您还需要将unlink设置为1。

注意

在访问条件复杂的情况下,可以对每个访问请求(读取,写入,创建和取消链接)使用单独的规则。

我希望这对您有帮助