15、安全与权限(Security)
在odoo中配置访问控制机制来实现连贯的安全策略。
Odoo的权限的核心是权限组(res_groups)。基于组的访问控制机制。
通过组权限来实现权限管理,组是保存在res.groups里的一些记录。
菜单的权限可以通过xml中菜单的定义设置组权限。
菜单下关联的model也要设置对象级别的访问权限(read读, write写, create增, unlink删),并关联到特定组。
还有一些model.py里的做权限检查或xml定义中设置field相关的组。
权限管理的四个层次
- 菜单级别:不属于指定菜单所包含组的用户看不到该菜单(不安全),只是隐藏菜单,若知道菜单ID,仍然可以通过指定URL访问
- 对象级别:对某个角色是否有’创建,读取,修改,删除’的权限,可以简单理解为表对象
- 记录级别:对对象表中的数据的访问权限,比如访问“客户”对象,业务员只能对自己创建的客户有访问权限,而经理可以访问其管辖的业务员所有的“客户”对象
- 字段级别:一个对象或表上的某些字段的访问权限,比如产品的成本字段只有经理有读权限
<field name="name" options="{'no_create': True}" groups="myproject.group_manager"/>
访问权限
访问权限是model - ir.model.access.csv的一些记录。通过ir.model.access.csv文件配置来导入一些记录值使之生效。
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_payment_transaction_invoice,payment.transaction.invoice,model_payment_transaction_invoice,account.group_account_invoice,1,1,1,1
id唯一的id 映射到ir_model_data中
name显示名
model_id:id model的xml_id
group_id:id group的xml_id (可空 为全局权限)
perm_read,perm_write,perm_create,perm_unlink 读 写 创建 删除权限
方式一:后台添加权限关系
直接在odoo后台添加权限关系。
先在myproject/my_first_app/security/创建一个myproject_security.xml,然后把新建的模型course和session注册到ir.module.category(模型类别)中:
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<data>
<!-- 添加模型course到应用category中 -->
<record id="module_myproject_course" model="ir.module.category">
<field name="name">课程</field>
</record>
<!-- 添加模型session到应用category中 -->
<record id="module_myproject_session" model="ir.module.category">
<field name="name">讲座</field>
</record>
</data>
</odoo>
在myproject/my_first_app/__manifest__.py
中的data中添加myproject_security.xml文件:
'data': [
'security/myproject_security.xml',
'data/course_data.xml',
'data/session_data.xml',
'views/menu_views.xml',
'views/course_views.xml',
'views/session_views.xml',
'views/res_partner_views.xml',
],
更新应用。然后激活开发者模式(debug=assets) [http://127.0.0.1:8069/web?debug=assets]。
创建一个用户John Smith,创建一个组myproject/ Session Read 关联到Session model。
操作步骤
1 通过菜单 设置->用户-> 创建John Smith用户
2 通过菜单设置->群组->创建 session_read用户组,对Session model可读,应用程序选择‘讲座’,访问权设置只读,用户: 把John Smith 加入session_read组,
其中访问权限设置为只读
3 用John Smith登陆测试
方式二、xml文件定义权限
使用xml文件定义权限,创建myproject/ Manager组并关联到所有myproject模型,让Session和Course模型对所有用户可读。
1 在myproject/my_first_app/security/myproject_security.xml中创建一个管理组
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<data>
<!-- 添加模型course到应用category中 -->
<record id="module_myproject_course" model="ir.module.category">
<field name="name">课程</field>
</record>
<!-- 添加模型session到应用category中 -->
<record id="module_myproject_session" model="ir.module.category">
<field name="name">讲座</field>
</record>
<!-- 创建一个管理组 -->
<record id="myproject_group_manager" model="res.groups">
<field name="name">myproject / Manager</field>
</record>
<!-- 创建一个用户组 -->
<record id="myproject_group_user" model="res.groups">
<field name="name">myproject / User</field>
</record>
</data>
</odoo>
2 在myproject/my_first_app/security/ir.model.access.csv写入访问权限:
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_myproject_course_manager,myproject.course,model_myproject_course,my_first_app.myproject_group_manager,1,1,1,1
access_myproject_course_user,myproject.course,model_myproject_course,my_first_app.myproject_group_user,1,0,0,0
access_myproject_session_manager,myproject.session,model_myproject_session,my_first_app.myproject_group_manager,1,1,1,1
access_myproject_session_user,myproject.session,model_myproject_session,my_first_app.myproject_group_user,1,0,0,0
3 在myproject/my_first_app/__manifest__.py
中的data中添加ir.model.access.csv文件:
'data': [
'security/myproject_security.xml',
'security/ir.model.access.csv',
'data/course_data.xml',
'data/session_data.xml',
'views/menu_views.xml',
'views/course_views.xml',
'views/session_views.xml',
'views/res_partner_views.xml',
],
更新应用,效果图如下:
点击myproject/Manager可以查看访问权限。
记录规则
通过记录规则用特定条件来约束模型的权限。
规则保存在ir.rule模型表里,需要设置关联某个模型,关联很多组,访问权限控制和domian。通过domain_force过滤出的一些记录来执行约束。
下面的例子,使销售经理只能删除状态为取消的客户线索。注意向many2many字段添加值的写法。
<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>
用户只能查看所在公司或关联下的公司的数据:
<record model="ir.rule" id="supplier_balance_rule">
<field name="name">supplier balance multi-company</field>
<field name="model_id" search="[('model','=','supplier.balance')]" model="ir.model"/>
<field name="global" eval="True"/>
<field name="domain_force">['|',('company_id','child_of',[user.company_id.id]),('company_id','=',False)]
</field>
</record>
为课程模型和myproject / Manager组添加一条记录规则,只有课程负责人可以编辑课程,如果课程没有负责人,任何人都可以编辑:
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<data>
<!-- 添加模型course到应用category中 -->
<record id="module_myproject_course" model="ir.module.category">
<field name="name">课程</field>
</record>
<!-- 添加模型session到应用category中 -->
<record id="module_myproject_session" model="ir.module.category">
<field name="name">讲座</field>
</record>
<!-- 创建一个管理组 -->
<record id="myproject_group_manager" model="res.groups">
<field name="name">myproject / Manager</field>
</record>
<!-- 创建一个用户组 -->
<record id="myproject_group_user" model="res.groups">
<field name="name">myproject / User</field>
</record>
<!-- 记录规则-->
<record id="only_responsible_can_modify" model="ir.rule">
<field name="name">Only Responsible can modify Course</field>
<field name="model_id" search="[('model','=','myproject.course')]" model="ir.model"/>
<field name="groups" eval="[(4, ref('my_first_app.myproject_group_manager'))]"/>
<field name="perm_read" eval="0"/>
<field name="perm_write" eval="1"/>
<field name="perm_create" eval="0"/>
<field name="perm_unlink" eval="1"/>
<field name="domain_force">['|', ('responsible_id','=',False), ('responsible_id','=',user.id)]
</field>
</record>
</data>
</odoo>
odoo对many2many、one2many的操作
many2many
(0,0,{values}) 根据values里面的信息新建一个记录。
(1,ID,{values})更新id=ID的记录(写入values里面的数据)
(2,ID) 删除id=ID的数据(调用unlink方法,删除数据以及整个主从数据链接关系)
(3,ID) 切断主从数据的链接关系但是不删除这个数据
(4,ID) 为id=ID的数据添加主从链接关系。
(5) 删除所有的从数据的链接关系就是向所有的从数据调用(3,ID)
(6,0,[IDs]) 用IDs里面的记录替换原来的记录(就是先执行(5)再执行循环IDs执行(4,ID))
例子[(6, 0, [8, 5, 6, 4])] 设置 many2many to ids [8, 5, 6, 4]
one2many
(0, 0,{ values })根据values里面的信息新建一个记录。
(1,ID,{values}) 更新id=ID的记录(对id=ID的执行write 写入values里面的数据)
(2,ID) 删除id=ID的数据(调用unlink方法,删除数据以及整个主从数据链接关系)
odoo权限机制总结参考
公众号
关注我,我们一起成长~~