【发布时间】: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?这不是破坏模型访问赋予我的读取权限吗?我认为全局或非全局规则限制了模型访问。
为什么我可以读取员工用户不是我的记录?它们不符合规则,所以我应该看不到它们,不是吗?
【问题讨论】: