一如既往,规则问题。我以为我终于了解了它们,但不是。
我正在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?这不是破坏模型访问所赋予的读取权限吗?我认为全局或非全局规则限制了模型访问。
为什么我可以读取其雇员不是我的用户的记录?它们不符合规则,所以我应该看不到它们,不是吗?
答案 0 :(得分:2)
我认为您误解了记录规则perm_*
,使记录规则适用或相反。
A :读取值设置为0,以确保用户发出读取请求时不评估此规则。而且,您不会破坏模型访问权限所赋予的读取权限,如果将读取值设置为1,则可以说您正在缩小模型访问权限,从整个模型到仅通过强制域的记录。 / p>
问:为什么我可以读取其雇员不是我的用户的记录?它们不符合规则,所以我应该看不到它们,对吗?
A :**根据您的模型访问权限,两个组都具有读取访问权限,并且没有记录规则限制读取访问权限。
第一个规则hr_attendance_rule_attendance_manager
在访问组{{1}的read
,write
,create
和unlink
上进行评估}。 (未提供任何明确的评估结果,默认情况下设置为1)
第二条规则hr_attendance.group_hr_attendance_user
仅在hr_attendance_rule_attendance_employee
和write
访问(perm_write = 1和perm_create = 1)上评估,而在{{1} }和create
访问(perm_read = 0和perm_unlink = 0)。
您还应该可以取消链接:)。要获得所需的结果,您需要将read
设置为1,并强制域进行取消链接访问,您还需要将unlink
设置为1。
在访问条件复杂的情况下,可以对每个访问请求(读取,写入,创建和取消链接)使用单独的规则。
我希望这对您有帮助