15、安全与权限(Security)

点我下载完整odoo的demo

在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安全与权限_odoo

其中访问权限设置为只读

10、odoo安全与权限_odoo_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安全与权限_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安全与权限_odoo_04

 

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