15、安全与权限(Security)

​​​点我下载完整odoo的demo​


​python学习手册大全点我下载​

在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组,

10、odoo安全与权限_访问权限

其中访问权限设置为只读

10、odoo安全与权限_xml_02

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',
],

更新应用,效果图如下:

10、odoo安全与权限_数据_03

点击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的demo

odoo权限机制总结参考


后记

【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。


如果文章对您有帮助,请我喝杯咖啡吧!

公众号

10、odoo安全与权限_xml_04


关注我,我们一起成长~~