安全性
访问控制机制必须与安全策略一同配置。
基于“用户组”的访问控制
用户组是 res.groups
实体的数据记录,通过菜单定义授予菜单访问权限。然而如果没有菜单,对象还是有可能通过非直接方式进行访问,所以实际的基于对象级别的访问控制(读、写、创建、取消链接-unlink)必须针对用户组进行定义。通常情况下使用 CSV 文件定义,也可以通过视图的字段或者业务对象的“组(group)”属性限制访问。
访问权限
访问权限通过 ir.model.access
实体的数据记录定义。每个访问权限关联到一个实体、一个用户组(或者没有组的情况下针对全局访问),以及一系列授权:读、写、创建、取消链接(unlink)。这些权限通常用 CSV 文件定义,文件命名规则: ir.model.access.csv
。
id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink
access_idea_idea,idea.idea,model_idea_idea,base.group_user,1,1,1,0
access_idea_vote,idea.vote,model_idea_vote,base.group_user,1,1,1,0
安全性练习:10-1
通过 odoo 界面添加访问控制。
创建一个用户 "John Smith"。然后创建一个用户组 “ "OpenAcademy / Session Read" 授予 Session 实体读权限。
- 通过 Settings ‣ Users ‣ Users 功能创建用户 “John Smith”;
- 通过 Settings ‣ Users ‣ Groups 功能创建用户组
session_read
,授予 Session 实体的读权限;- 编辑 “John Smith” 为用户组
session_read
的成员;- 以 “John Smith” 身份登录检验访问权限的准确性。
安全性练习:10-2
通过数据文件添加访问控制,使用数据文件:
- 创建一个用户组 “OpenAcademy / Manager”,授予访问 OpenAcademy 所有实体的所有权限;
- 授予所有用户 Session 和 Course 的读权限;
- 创建一个文件
openacademy/security/security.xml
存储 OpenAcademy Manager 组的定义- 编辑文件
openacademy/security/ir.model.access.csv
授予指定的权限;- 最后,修改
openacademy/__manifest__.py
添加授权文件;openacademy/__manifest__.py
openacademy/security/ir.model.access.csv
openacademy/security/security.xml
数据记录规则
数据记录规则控制实体的部分数据记录的访问权限。一个规则是实体 ir.rule
的一条数据记录,并且关联到一个实体,一些组(many2many 字段),以应用这些授权的控制。领域规则(domain)设定哪些数据记录应用访问权限控制。
示例:禁止删除 leads 实体非
cancel
状态的数据记录的规则。注意groups
字段的值必须遵循 ORM 的方法write()
一致的转换规则。
<record id="delete_cancelled_only" model="ir.rule">
<field name="name">Only cancelled leads may be deleted</field>
<field name="model_id" ref="crm.model_crm_lead"/>
<field name="groups" eval="[(4, ref('sales_team.group_sale_manager'))]"/>
<field name="perm_read" eval="0"/>
<field name="perm_write" eval="0"/>
<field name="perm_create" eval="0"/>
<field name="perm_unlink" eval="1" />
<field name="domain_force">[('state','=','cancel')]</field>
</record>
安全性练习:10-3
数据记录规则:
为实体 Course 和 "OpenAcademy / Manager"用户组添加一条数据记录规则,限制只有负责人才能修改课程(
write
和unlink
)。如果一个课程没有负责人,该用户组的所有用户必须能够修改该课程。在文件
openacademy/security/security.xml
中创建规则。