为什么这些规则在 Odoo 11 中有这种行为?
Why do these rules have this behaviour in Odoo 11?
一如既往,规则有问题。我以为我终于理解了他们,但不是。
我正在查看 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>
行为
如果我用属于手动考勤组的基本用户登录,我可以看到不是我的员工用户的考勤,如果我打开并尝试修改他们,我收到安全错误:(文档类型:出勤,操作:写入)。
我认为这个案例如何运作
我的用户属于 手动考勤 组:它没有模型访问权限,所以我有 CRUD 0 0 0 0(我无法创建、读取、更新或删除任何记录hr_attendance
模型)。但是我的用户(和每个人一样)也属于 Employee 组,所以我也有 CRUD 1 1 1 0。由于模型访问是累加的,我可以创建、读取和更新任何记录hr_attendance
模型,但不删除。
之后,规则限制了CRUD。非全局规则 hr_attendance_rule_attendance_employee
(用户:仅修改自己的出勤率)正在影响我的用户:据推测,我的组可以访问与域匹配的记录。其他的不会。因此,我将无法与员工用户不是我的出席者互动。我在这里有两个疑问:
为什么规则的读取为 0?这不是破坏了模型访问授予的我的读取权限吗?我认为全局或非全局规则限制了模型访问。
以及为什么我可以读取员工用户不是我的记录?它们不符合规则,所以我应该看不到它们,不是吗?
我认为你误解了记录规则perm_*
,用来使记录规则适用或相反。
您的问题:
- 问:为什么规则的读入为0?这不是破坏了模型访问给我的读取权限吗?
A:读取值设置为0以确保当用户发出读取请求时不评估此规则。并且您没有破坏模型访问权限授予的读取权限,如果读取值设置为 1,则可以说您正在缩小模型访问权限,从整个模型到仅通过强制域的记录。
问: 为什么我能读到员工用户不是我的记录?它们不符合规则,所以我应该看不到它们,不是吗?
A: **根据你的model access,两个组都有read access,没有record rules限制read access。
怎么做!?为什么!!!?
第一个规则 hr_attendance_rule_attendance_manager
,根据对组的 read
、write
、create
和 unlink
访问进行评估hr_attendance.group_hr_attendance_user
。 (没有提供明确的评估 peams,默认设置为 1)
第二条规则 hr_attendance_rule_attendance_employee
仅在 write
和 create
访问(perm_write=1 和 perm_create= 1), 并且未在 read
和 unlink
访问(perm_read=0 和 perm_unlink=0)上评估。
所以
您应该也可以取消链接 :)。要获得您想要的结果,您需要将 perm_read
设置为 1,并强制对域进行取消链接访问,您需要将 perm_unlink
也设置为 1。
备注
当您的访问条件复杂时,您可以为每个访问请求(读取、写入、创建和取消链接)使用单独的规则。
希望对您有所帮助
一如既往,规则有问题。我以为我终于理解了他们,但不是。
我正在查看 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>
行为
如果我用属于手动考勤组的基本用户登录,我可以看到不是我的员工用户的考勤,如果我打开并尝试修改他们,我收到安全错误:(文档类型:出勤,操作:写入)。
我认为这个案例如何运作
我的用户属于 手动考勤 组:它没有模型访问权限,所以我有 CRUD 0 0 0 0(我无法创建、读取、更新或删除任何记录hr_attendance
模型)。但是我的用户(和每个人一样)也属于 Employee 组,所以我也有 CRUD 1 1 1 0。由于模型访问是累加的,我可以创建、读取和更新任何记录hr_attendance
模型,但不删除。
之后,规则限制了CRUD。非全局规则 hr_attendance_rule_attendance_employee
(用户:仅修改自己的出勤率)正在影响我的用户:据推测,我的组可以访问与域匹配的记录。其他的不会。因此,我将无法与员工用户不是我的出席者互动。我在这里有两个疑问:
为什么规则的读取为 0?这不是破坏了模型访问授予的我的读取权限吗?我认为全局或非全局规则限制了模型访问。
以及为什么我可以读取员工用户不是我的记录?它们不符合规则,所以我应该看不到它们,不是吗?
我认为你误解了记录规则perm_*
,用来使记录规则适用或相反。
您的问题:
- 问:为什么规则的读入为0?这不是破坏了模型访问给我的读取权限吗?
A:读取值设置为0以确保当用户发出读取请求时不评估此规则。并且您没有破坏模型访问权限授予的读取权限,如果读取值设置为 1,则可以说您正在缩小模型访问权限,从整个模型到仅通过强制域的记录。
问: 为什么我能读到员工用户不是我的记录?它们不符合规则,所以我应该看不到它们,不是吗?
A: **根据你的model access,两个组都有read access,没有record rules限制read access。
怎么做!?为什么!!!?
第一个规则
hr_attendance_rule_attendance_manager
,根据对组的read
、write
、create
和unlink
访问进行评估hr_attendance.group_hr_attendance_user
。 (没有提供明确的评估 peams,默认设置为 1)第二条规则
hr_attendance_rule_attendance_employee
仅在write
和create
访问(perm_write=1 和 perm_create= 1), 并且未在read
和unlink
访问(perm_read=0 和 perm_unlink=0)上评估。
所以
您应该也可以取消链接 :)。要获得您想要的结果,您需要将 perm_read
设置为 1,并强制对域进行取消链接访问,您需要将 perm_unlink
也设置为 1。
备注
当您的访问条件复杂时,您可以为每个访问请求(读取、写入、创建和取消链接)使用单独的规则。
希望对您有所帮助