ODOO权限管理

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

权限等级

  • 第一级是access rule,即表级(对象)权限,控制用户组对某个对象是否有创建、读取、修改、删除的权限,一般是用security/ir.model.access.csv文件来管理。
  • 第二级是行级权限,控制用户组对表中数据行的访问权限,可以写在views/views.xml文件中。
  • 第三级是字段级权限,一个对象或表上的某些字段的访问权限。
  • 第四级是菜单级权限,不属于指定菜单所包含组的用户看不到该菜单。

其实简单的理解就是

对于数据表Table A


用户能不能看见这个表的内容(字段及数据),就是表级权限

用户能不能看见表A的某行(数据),就是行级权限(记录及权限)

用户是否能看见表A的字段(列),就是字段及权限

对于odoo的菜单,用户是否可见,就是菜单级权限

创建模块

版本:odoo8

(python 2.7环境)

python ./odoo.py scaffold academy ./openerp/addons_test

切换用户到开发者模式
右上角用户,点击关于,页面右上角“激活开发者模式”

更新模块列表
Settings->Modules->Update Modules List

安装模块
Settings->右上角搜索模块名

一、表级权限

新建model

academy/models.py

class Teachers(models.Model):
    _name = 'academy.teachers'

    name = fields.Char('Teacher Name')
    biography = fields.Html()
    user_id = fields.Many2one('res.users', string="User", ondelete='cascade', required="true")

class Courses(models.Model):
    _name = 'academy.courses'
    name = fields.Char()
    teacher_id = fields.Many2one('academy.teachers', string="Teacher")
    course_ids = fields.One2many('academy.courses', 'teacher_id', string="Courses")

给两个表添加基本的视图以及新建两个菜单

academy/views.xml

<openerp>
    <data>
        <record id="action_academy_teachers" model="ir.actions.act_window">
            <field name="name">Academy teachers</field>
            <field name="res_model">academy.teachers</field>
        </record>

        <record id="academy_teacher_tree" model="ir.ui.view">
            <field name="name">Academy teachers: tree</field>
            <field name="model">academy.teachers</field>
            <field name="arch" type="xml">
                <tree>
                    <field name="user_id"/>
                </tree>
            </field>
        </record>
        <record id="academy_teacher_form" model="ir.ui.view">
            <field name="name">Academy teachers: form</field>
            <field name="model">academy.teachers</field>
            <field name="arch" type="xml">
                <form>
                    <sheet>
                        <label for="user_id"/> <field name="user_id"/>
                        <label for="biography"/>
                        <field name="biography"/>
                    </sheet>
                </form>
            </field>
        </record>

        <record id="action_academy_courses" model="ir.actions.act_window">
            <field name="name">Academy courses</field>
            <field name="res_model">academy.courses</field>
        </record>
        <record id="academy_course_search" model="ir.ui.view">
            <field name="name">Academy courses: search</field>
            <field name="model">academy.courses</field>
            <field name="arch" type="xml">
                <search>
                    <field name="name"/>
                    <field name="teacher_id"/>
                </search>
            </field>
        </record>
        <record id="academy_course_list" model="ir.ui.view">
            <field name="name">Academy courses: list</field>
            <field name="model">academy.courses</field>
            <field name="arch" type="xml">
                <tree string="Courses">
                    <field name="name"/>
                    <field name="teacher_id"/>
                </tree>
            </field>
        </record>
        <record id="academy_course_form" model="ir.ui.view">
            <field name="name">Academy courses: form</field>
            <field name="model">academy.courses</field>
            <field name="arch" type="xml">
                <form>
                    <sheet>
                        <label for="name"/>
                        <field name="name"/>
                        <label for="teacher_id"/>
                        <field name="teacher_id"/>
                    </sheet>
                    <div class="oe_chatter">
                        <field name="message_follower_ids" widget="mail_followers"/>
                        <field name="message_ids" widget="mail_thread"/>
                    </div>

                </form>
            </field>
        </record>

        <menuitem sequence="0" id="menu_academy" name="Academy"/>
        <menuitem id="menu_academy_content"
                  parent="menu_academy"
                  name="Academy Content"/>
        <menuitem id="menu_academy_content_teachers"
                  parent="menu_academy_content"
                  action="action_academy_teachers"/>
        <menuitem id="menu_academy_content_courses"
                  parent="menu_academy_content"
                  action="action_academy_courses"/>
    </data>
</openerp>

表级的权限控制文件在academy/security/ir.model.access.csv

id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_academy_teachers,access_academy_teachers,model_academy_teachers,,1,0,0,0

如上的group_id没有加,就是对所有组公开了teacher表的读取权限,重启odoo并升级(admin),切换用户(非admin),可看到效果页面:


可以看到该用户对teacher仅有读取权,但添加、修改、删除不能操作。

二、行级权限

比如访问“客户”对象,业务员只能对自己创建的客户有访问权限,而经理可以访问其管辖的业务员所有的“客户”对象。在ir.rule模型中定义规则,存储在public.ir_rule表格里面。
新建规则文件security/academy_record_rules.xml,并注册到__openerp__.py的data的属性中。

security/academy_record_rules.xml

<?xml version="1.0" encoding="utf-8"?>
<openerp>
    <data noupdate="1">
        <record id="academy_user_rule" model="ir.rule">
            <field name="name">Academy only for owner</field>
            <field name="model_id" ref="model_academy_teachers"/>
            <field name="domain_force">
                [('create_uid','=',user.id)]
            </field>
            <!--<field name="groups" eval="[(4,ref('base.group_user'))]"/>-->
        </record>
    </data>
</openerp>
name 规则名称
model_id 对应的模型
global 是否是全局
domain_force 过滤条件,在创建id等于当前用户id时,显示该条记录

groups 属于哪个组base.group_user是所有组,可以不写

security/ir.model.access.csv

id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_academy_teachers,access_academy_teachers,model_academy_teachers,,1,1,1,1
access_academy_courses,access_academy_courses,model_academy_courses,,1,0,0,0

先开放teacher模块对所有组的所有权限,重启Odoo并升级academy,登陆非admin用户,可以看到teacher可新建,并只能看见自己创建的数据。

注释

(4,ID)添加主从链接关系到id=ID的对象。

(3,ID)去除和id=ID的对象主从链接关系,但是不删除这个对象

(2,ID) 去除和id=ID的对象主从链接关系,并且删除这个对象(调用unlink方法)

(5) 去除所有的链接关系,也就是循环所有的从数据且调用(3,ID)

(6,0,[IDs]) 用IDs里面的记录替换原来链接的记录,即先执行(5)再循环IDs执行(4,ID)

三、字段级权限

创建用户的权限组使用record记录,存储在res.groups里

security/academy_groups.xml

<?xml version="1.0" encoding="utf-8"?>
<openerp>
    <data noupdate="1">
        <record model="ir.module.category" id="module_category_academy_test">
            <field name="name">academy test</field>
        </record>
        <record id="academy_teachers_group" model="res.groups">
            <field name="name">Academy teachers group</field>
            <field name="comment">the comment of the group.</field>
            <field name="category_id" ref="module_category_academy_test"/>
            <!--<field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>-->
            <!--<field name="users" eval="[(4, ref('base.user_root'))]"/>-->
        </record>
        <record id="academy_managers_group" model="res.groups">
            <field name="name">Academy managers group</field>
            <field name="comment">the comment of the group.</field>
            <field name="category_id" ref="module_category_academy_test"/>
        </record>
    </data>
</openerp>

首先定义了分组category,然后定义了两个组属于同一分组(也可以不写分组)。

注释

name 组名
comment 组的注释
category_id 所属于哪个模块
users 预定义属于该组的用户
implied_ids

在demo.xml中添加两条记录,创建两个用户
demo.xml

        <record id="user_teacher_a" model="res.users">
            <field name="name">teacherA</field>
            <field name="login">teacher.a@email.com</field>
            <field name="password">academy</field>
        </record>
        <record id="user_teacher_b" model="res.users">
            <field name="name">teacherB</field>
            <field name="login">teacher.b@email.com</field>
            <field name="password">academy</field>
        </record>

        <record id="teacher_a" model="academy.teachers">
            <field name="name">TeacherA</field>
            <field name="work_email">teacher.a@academy.com</field>
            <field name="user_id" ref="academy.user_teacher_a"/>
        </record>
        <record id="teacher_b" model="academy.teachers">
            <field name="name">TeacherB</field>
            <field name="work_email">teacher.b@academy.com</field>
            <field name="user_id" ref="academy.user_teacher_b"/>
        </record>

登陆admin给teacherA添加到academy_teachers_group组,设置->用户 找到teacherA编辑,会看到权限多了分组,勾选Academy teachers group。


给字段添加组权限有两个地方

在视图中给field加groups属性
academy/views.xml

        <record id="academy_teacher_tree" model="ir.ui.view">
            <field name="name">Academy teachers: tree</field>
            <field name="model">academy.teachers</field>
            <field name="arch" type="xml">
                <tree>
                    <field name="user_id"/>
                    <field name="name"/>
                    <field name="biography" groups="academy.academy_teachers_group"/>
                    <field name="show_group_teacher"/>
                </tree>
            </field>
        </record>
或者在字段定义的地方加groups属性

academy/models.py

class Teachers(models.Model):
    _name = 'academy.teachers'

    name = fields.Char('Teacher Name')
    biography = fields.Html()
    user_id = fields.Many2one('res.users', string="User", ondelete='cascade', required="true")
    show_group_teacher = fields.Char('Show For Teacher', groups="academy.academy_teachers_group")

重启odoo并升级academy,可以登陆TeacherA和TeacherB查看效果。

四、菜单级权限

在菜单定义处加groups属性(或者groups_id)

academy/views.xml

        <menuitem id="menu_academy_content_courses"
                  parent="menu_academy_content"
                  action="action_academy_courses"
                  groups="academy.academy_teachers_group"/>
重启odoo并升级academy,可以登陆TeacherA和TeacherB查看效果。
odoo14:权限管理(访问权限及记录规则)结合开发经历详细讲解 前言: odoo框架自带了比较完善的权限控制机制,包含两种数据驱动机制来管理或限制对数据的访问。 这两种机制都通过组链接到特定的用户:一个用户属于任意数量的组,安全机制与组相关联,从而将安全机制应用于用户。 1.odoo权限的层级划分 根据对象不同主要分为四个层级:对象(表级)访问权限、记录规则级权限(可以理解为表的行权限管理)、字段级权限(一个对象或表上的某些字段的访问权限)、菜单权限 关系:先判断对象级权限,满足条件再判断记录规则级权限,满足条件再判断字段级权限。 可以.. 阅读详情

相关推荐

Odoo16—权限控制

odoo权限控制是通过来实现的,在用户组中配置控制权限,然后再添加用户到用户组中,从而实现对用户的访问和操作权限控制。一个用户可以属于多个用户组,用户最终的权限范围取决于所属用户组权限的并集。在用户组中可以声明哪些数据的控制权限呢?我们打开开发者模式,通过“”导航到用户组,点击任一用户组,打开如下截图界面:。既然如此,那就赶快创建一个用户组,然后配置权限,然后添加用户,然后……不就可以达到我想要的权限控制目的了吗。

tianquan007716的专栏 3202

Odoo 权限管理学习总结 Python

然后,我们将这些用户、用户组和访问规则应用到Odoo中的不同对象上,通过重写相应的方法来控制用户对这些对象的访问权限。Odoo是一种功能强大的开源企业资源计划(ERP)软件,它提供了灵活的权限管理功能,可以根据用户角色和组织结构来控制对不同功能和数据的访问权限。通过灵活运用Python和Odoo的API,您可以根据自己的业务需求定制和扩展权限管理功能,并确保系统的安全性和可靠性。用户是系统中的个体,用户组是一组用户的集合,而访问规则定义了用户和用户组对特定对象的访问权限。首先,我们需要创建用户和用户组。

DarcyCode的博客 208

odoo权限管理

除了使用自定义代码管理访问外,Odoo主要以数据驱动的方式进行权限管理。这种机制通过组与特定用户相关联:用户属于一个或多个组,权限与组关联,从而将权限应用于用户。 https://www.jianshu.com/p/e796b15df74a 模型权限 在security文件夹下的ir.model.access.csv文件中定义模型的访问权限。 通过ir.model.access的记录行进行管...

weixin_42583946的博客 732

Odoo开发中的权限管理

本文开始前我们首先要知道的是,我们安装好odoo并配置好数据库之后,即便不加载任意一个模块,odoo也会在数据库中默认创建一些数据表。这些表就是用来存放模块的数据模型名、字段名、页面组件、权限配置等信息的,我们创建的每一个数据模型、模型的每一个字段、每一个模型的表单等等都是在odoo框架中都是以一条条数据记录的方式存储在数据库中的。

DAO_HUNG的博客 1326

odoo 12 : 权限安全(security)

Odoo 中使用安全组来实现,权限授予组,组中分配用户。Odoo 应用通常有两个组:针对普通用户的用户组,包含额外应用配置权限的管理员组。 1. 文件 security/模型名_security.xml security/ir.model.access.csv 2. 示例 book_security.xml <?xml version="1.0" encoding="utf-8"?&...

Siimple的博客 2261

odoo权限管理

作者:luohuayong 链接:https://www.jianshu.com/p/bc4e9db349a2 來源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。 id 权限id,默认规则是access_模块名_类名,还没发现有什么用name 权限名,默认规则是模块名.类名,还没发现有什么用model_id:id 这个是固定写法,规则是model_模块名_类名,其...

黄油猫 1556

odoo 权限管理

odoo权限管理: 权限等级 第一级是access rule,即表级(对象)权限,控制用户组对某个对象是否有创建、读取、修改、删除的权限,一般是用security/ir.model.access.csv文件来管理。 第二级是行级权限,控制用户组对表中数据行的访问权限,可以写在views/views.xml文件中。 第三级是字段级权限,一个对象或表上的某些字段的访问权限。 第四级是菜单级权限,不属于...

qq_43385074的博客 467

odoo权限管理详解

mark

weijiaの博客 4730

odoo中的权限管理

odoo权限管理总结,经验之谈,欢迎指正。 模型权限设置 在一个模块中新建了一个模型都必须对此模型进行权限配置,因为默认模型是没有任何权限设置的,开发的时候使用admin账号可以看到但正常账户是无法看见模型的。所以这是最基本的权限配置,哪怕你的模块没有特殊权限对所有人都开放也必须进行配置。 对模型的权限设置一般是在security/ir.model.access.csv文件中...

weixin_30492601的博客 767

Odoo软件二次开发:Odoo安全性与权限管理

Odoo权限管理机制提供了强大的工具来控制用户对系统中数据的访问。通过理解Odoo的权限模型、用户与组的概念、访问控制列表(ACL)以及权限的动态管理、继承与覆盖,开发者可以有效地实现安全性和权限管理,确保数据的完整性和安全性。此外,通过使用基于规则的权限、字段级权限和记录级权限,可以实现更精细的权限控制,满足复杂业务场景的需求。

kkchenjj的博客 2349

odoo13权限管理

odoo13权限管理 例如,想实现 经理,可以看到该模块,然后可以增删改查 test1,可以看到该模块,然后只可以查 test2,不可以看到该模块 1 首先定义用户组 需要在模块德security文件夹下创建一个XML文件,定义用户组。并且需要加载到mainfest文件里,见下图第一个xml就是自己创建的,具体代码见最后附件 2,设置用户组的访问权限 打开debug模式后,进入设置–技术–数据库结构-模型 找到需要操作的模型并进入 设置点击访问权限 设置访问权限 如果,所有权限全部不选择,则该用户

weixin_43313367的博客 539

odoo12 用户(users) 权限管理界面分析

起因: 由于需要了解 odoo权限管理,去看了下 odoo 是如何给用户赋权限的。发现好多不能理解。因此,打算从 user 的xml开始。看里面到底是什么意思 第一步,肯定查看user的xml。找user源码 odoo/odoo/addons/base/views/res_users_views.xml <record id="view_users_form" model="...

1426

erp odoo 权限管理5年系统设置经验小结 真经验分享

erp odoo 权限管理5年系统设置经验小结目录前言菜单权限数据模型权限action权限记录规则权限按钮权限角色权限模块权限 每种系统的权限不同,但均是围绕业务进行的。我们日常工作中需要有几类人员:处理订单的客服人员、处理采购的采购人员、管发货的库管人员、做财务的会计人员。这些不同人员在系统中怎样各司其职,干好相应工作呢?这需要我们分配相应的权限给员工,使其工作细化专职做好份内事。odoo的权限功能很强大,直要你愿意,可以控制的粒度很细,经过这5年多的不同系统配置,不同的业务系统,配的权限均

fqfq123456的专栏 358

Odoo多级权限管理实现效果

odoo中不需要开发,通过设置就可以实现复杂的多级权限管理功能,如销售员只能操作自己的客户;销售组长可以操作本组用户的客户,但不能操作其他组的;销售总监可以操作所有客户。 看下实际效果视频: odoo实现的多级权限管理 点击查看odoo中具体实现多级权限的方法 ...

勤哲excel服务器破解|注册机|技术研讨 795

Odoo权限管理

Odoo中,使用用户组(res.groups)来管理权限,一个特殊的用户组是 员工/员工(base.group_user) 组,所有的用户都属于这个组,这个组里包含一些基本的权限。四种权限级别(粒度越来越细):1.菜单/对象级别设置哪些人可以访问哪些菜单/对象,对象的访问权限包括创建、读、写、删除。2.记录级别设置哪些人可以访问哪些记录...

weixin_34259559的博客 758

ODOO权限管理,在两个方面设置权限

转载参考https://zhuanlan.zhihu.com/p/29130388 在odoo中新建两个用户user1,user2 新建用户 建完了用户,记得编辑用户,设置密码。 然后以user1用户登录系统,在导航菜单中我们看不到请假菜单,因为我们没有给user1这个用户请假模块的权限。编辑security/ir.model.access.csv id,name,model_id:...

weixin_33919941的博客 1025

odoo 权限管理(访问权限及记录规则)结合实用,升级角色管理

自带了比较完善的权限控制机制,包含两种数据驱动机制来管理或限制对数据的访问。这两种机制都通过组链接到特定的用户:一个用户属于任意数量的组,安全机制与组相关联,从而将安全机制应用于用户。 分为四个层级的权限管理:模型(表级)、记录规则权限(每条记录的限制)、字段级权限、菜单权限。 1、 每个用户进行权限设置,菜单,模型,记录规则用户多时,分配勾选起来很麻烦,也累,就想着如何批量分配好,再勾选。2、用户有临时权限要求,能不能限时让起具备某功能,到时自动作废。用户权限

fqfq123456的专栏 725
上一篇: Django 自定义manage.py 命令
下一篇: odoo Binary field 下载后文件名的问题
__BOOM__
博客等级 码龄12年 174粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值