【转载】odoo技术开发白皮书 第一部分 第九章 权限

2023-11-02

转载:http://book.odoomommy.com/chapter1/README8.html

第九章 权限

Odoo的权限管理, 从粗到细可以大概分为四个等级, 对象级 视图级 字段级 记录级, 什么意思呢, 总结起来大概如下面的描述:

  • 对象级: 以对象模型为基准的权限划分, 可以理解为数据库中表级的访问权限控制
  • 视图级: 以视图为基准的权限划分, 不同用户组的用户可以看到不同的视图
  • 字段级: 以字段为基准的权限划分, 对字段的访问权限控制
  • 记录级: 以规则为基础的权限划分, 不同的记录适用于不同的规则体系下的用户权限访问控制

在了解这4个层级的权限控制之前, 我们首先要认知Odoo权限控制系统中的两大主角: 用户和组。

用户

用户的概念就是我们平时其他系统中的用户概念, 它代表了可以合法访问系统资源的对象。

用户的类型

在odoo中,用户可以分为三种类型:

  • 普通用户: 对应于系统中的用户,通常是企业内部用户
  • 门户用户:可以通过注册而来的用户,此类用户不能登录内部系统,只能拥有一个有限权限的门户账号,通常对应于企业的客户或供应商群体。
  • 公开用户:即无需注册就可以查看的用户,有限的访问权限,一般对应于游客权限。

用户的管理

用户在odoo中对应的对象模型是res.users,12.0内置了两个用户,id为1的是一个名叫Odoobot的机器人,它会记录用户的操作。id为2的是超级管理员账号。

创建用户的同时,系统会自动创建一个partner对象,并关联到用户上。

未设置密码的用户不允许登录

密码管理

odoo密码加密采用的是passlib库, passlib是一个跨平台的哈希算法库,支持30多种加密算法的实现。

DEFAULT_CRYPT_CONTEXT = passlib.context.CryptContext(
    # kdf which can be verified by the context. The default encryption kdf is
    # the first of the list
    ['pbkdf2_sha512', 'plaintext'],
    # deprecated algorithms are still verified as usual, but ``needs_update``
    # will indicate that the stored hash should be replaced by a more recent
    # algorithm. Passlib 1.6 supports an `auto` value which deprecates any
    # algorithm but the default, but Ubuntu LTS only provides 1.5 so far.
    deprecated=['plaintext'],
)

由odoo的源代码,可以得知,默认采用的加密算法是pbkdf2_sha512,简单说就是通过哈希算法加盐迭代数次得出的结果作为密码的算法。

pdkdf2(Password-Based Key Derivation Function),它的基本原理是通过一个伪随机函数(例如HMAC函数),把明文和一个盐值作为输入参数,然后重复进行运算,并最终产生密钥。如果重复的次数足够大,破解的成本就会变得很高。而盐值的添加也会增加“彩虹表”攻击的难度。

我们看一个经过这种加密算法得出的密码结构:

$pbkdf2-sha512$25000$tJbyHoNwLuX8f2.N8b43Bg$ViWUeJEtLMCm.NSmtMkZzG5M8.e312gzuee93VXqgGL.5izRTBL/Eza/7HMs.51SdpRjnRV2dVvCziQ3uTy07Q

密码通过$符号被分隔成4部分,第一个部分是计算算法名称,第二个是迭代次数,第三部分是盐值,第四部分是hash值。

12.0之前用户加密后的密码存在password_crypt字段中,12.0取消了这个字段,不再以明文存储。

密码的验证

odoo的密码验证使用passlib提供的verify_and_update方法,这个方法会根据当前密码使用的策略是否过时返回新策略的哈希值或空值。

odoo中验证用户密码使用低阶方法_check_credentials即可。

用户对象

用户对象(res.users)常用的几个方法有:

has_group

has_group方法用于确认用户是否属于某个用户组,接受一个参数xml_id。这里的xml_id指的是用户组的xmlid,例如:

self.env.user.has_group('base.group_system')

base.group_system 指代的是系统中的管理权限,意思就是判断当前用户是否是管理员组的成员。

用户组在odoo中的对象模型是res.groups,一个组里包含多个用户与用户是一对多的关系。

忘记密码

如果管理员忘记了密码,可以通过修改数据库的加密密码字段进行重置。方便起见,这里提供一个小工具,用于生成odoo要求的加密格式的密码。

#!/usr/bin/python3
# @Time    : 2019-08-07
# @Author  : Kevin Kong (kfx2007@163.com)

"""密码生成器"""

import passlib.context

DEFAULT_CRYPT_CONTEXT = passlib.context.CryptContext(
    # kdf which can be verified by the context. The default encryption kdf is
    # the first of the list
    ['pbkdf2_sha512', 'plaintext'],
    # deprecated algorithms are still verified as usual, but ``needs_update``
    # will indicate that the stored hash should be replaced by a more recent
    # algorithm. Passlib 1.6 supports an `auto` value which deprecates any
    # algorithm but the default, but Ubuntu LTS only provides 1.5 so far.
    deprecated=['plaintext'],
)

def generate_password(password):
    print(DEFAULT_CRYPT_CONTEXT.encrypt(password))


generate_password("admin")v

把这段代码保存为python文件运行即可。

这里提供一个原文为admin的加密示例,忘记密码的同学可以直接在数据库中将password字段修改为该字符串即可登录。 $pbkdf2-sha512$25000$X2vNmTMGAABAyDknJCTE2A$50FI91rr9B0JO8eAHKPqSPw0IPjYLfSSSTWeVFA5eK4yU8v79OwTZ3QxpEFXbGFivqMu6pohc5UltojXgfLlbg

或者直接执行下面的sql:

update res_users set password = '$pbkdf2-sha512$25000$X2vNmTMGAABAyDknJCTE2A$50FI91rr9B0JO8eAHKPqSPw0IPjYLfSSSTWeVFA5eK4yU8v79OwTZ3QxpEFXbGFivqMu6pohc5UltojXgfLlbg' where id = 2;

创建组

一般通过xml来定义组,跟定义视图类似,不过一般与用户安全相关的文件都放在security文件夹下。下面就是一个典型的组的定义:

<record id="group_sale_order_dates" model="res.groups">
    <field name="name">Manage delivery dates from sales orders.</field>
    <field name="category_id" ref="base.module_category_hidden"/>
    <field name="comment">This option introduces extra fields in the sales order to easily schedule product deliveries on your own: expected date, commitment date, effective date.</field>
</record>
  • category_id 是组的分类,在odoo的设置界面中一般被称作应用程序
  • comment: 组的说明

如果希望模块在安装的过程中就将系统预置的用户加入到我们定义的组中,那么可以在xml中像下面这样定义:

<record model="res.users" id="base.user_root">
    <field eval="[(4,ref('base.group_partner_manager'))]" name="groups_id"/>
</record>

组的继承

组也是可以被继承的,方法是在组的定义中使用implied_ids字段来指明要继承的组。

<record id="group_shop_user" model="res.groups">
    <field name="name">门店店员</field>
    <field name="category_id" ref="portal_category_healthelement"/>
    <field name="implied_ids" eval="[(4,ref('point_of_sale.group_pos_user'))]"/>
    <field name="comment">门店店员,只能查看所属门店的使用权限</field>
</record>

给西西弗书店添加专属应用组

接下来,我们给我们的书店应用创建两个组,店员和书店管理员。在这之前,我们要先创建一个应用分类。所谓应用分类,就是你在用户管理列表中看到分类,本质上是一个ir.module.category对象:

添加分类的方式和添加组类似:

<record model="ir.module.category" id="categ_book_store">
    <field name="name">西西弗书店</field>
</record>

然后我们添加两个组,一个店员一个管理员:

<record id="group_shop_user" model="res.groups">
    <field name="name">门店店员</field>
    <field name="category_id" ref="categ_book_store"/>
    <field name="implied_ids" eval="[(4,ref('base.group_user'))]"/>
    <field name="comment">门店店员,只能查看所属门店的使用权限</field>
</record>

<record id="group_shop_manager" model="res.groups">
    <field name="name">门店店长</field>
    <field name="category_id" ref="categ_book_store"/>
    <field name="implied_ids" eval="[(4,ref('group_shop_user'))]"/>
    <field name="comment">门店店长,只能管理自己的门店</field>
</record>

base.group_user是odoo中内置的内部用户的xml_id,因为我们的模块是内部应用,因此继承该组就不用再为了登录再重新分配权限。

升级西西弗斯书店模块,我们就能看到自己的组出现在了用户的权限列表中:

访问权限

用户和组有了,那么怎么控制用户的访问权限呢?

odoo对于用户的访问权限的设置有多级设计,大致可以分为如下几个层级:

  • 菜单级
  • 对象级
  • 视图级
  • 字段级

严格层度由大到小,菜单级仅仅是控制菜单的可见与否,并不能阻止用户通过URL直接访问对象界面。对象级才是真正访问控制的一级,渲染页面时,odoo会验证该页面所有引用到的对象与当前访问用户的权限关系,只有拥有访问权限的用户才能访问到页面。视图级是控制当前页面的某些部分只能由某些有权限的组访问,比如,产品的成本信息等。字段级,精确到某个字段应该由哪些组可以访问。

本节只介绍对象级的访问控制。其余将在第二部分介绍。

对象的访问权限主要控制的内容有读取(read)、创建(create)、修改(write)和删除(delete),也就是你在odoo的组的权限tab页中看到的内容:

即一个组对哪些对象,拥有哪些权限。通常这些由系统管理员进行配置。不过通常编写的模块都会将权限预置,在安装模块的时候就已经写入到数据库中了。预置的方法就是在security文件夹下新建一个csv文件,并配置在manifest文件的data中。csv文件的格式如下:

id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_book_store_book,book_store.book,model_book_store_book,base.group_user,1,1,1,1
access_book_store_author,book_store.author,model_book_store_author,base.group_user,1,1,1,1
access_book_store_publisher,book_store.publisher,model_book_store_publisher,base.group_user,1,1,1,1
access_book_store_ebook,book_store.ebook,model_book_store_ebook,base.group_user,1,1,1,1
access_book_store_sbook,book_store.sbook,model_book_store_sbook,base.group_user,1,1,1,1
  • id: 记录的id,保持唯一
  • name: 记录的名称
  • modelid: 模型的名称,对应odoo的对象,不同于odoo系统中显示的类似sale.order的对象,csv文件中的对象,需要以model\开头,并将对象中的点号用下划线取代,即sale.order在csv文件中表示为model_sale_order
  • group_id: 组的xmlid,通常由模块儿名和组的xmlid组成
  • perm_read:读权限 1 表示拥有 0 表示没有
  • perm_write:写权限 1 表示拥有 0 表示没有
  • perm_create:创建权限 1 表示拥有 0 表示没有
  • perm_unlink:删除权限 1 表示拥有 0 表示没有

继承的组会自动继承父组中的访问权限,因此,在父组中拥有的访问权限不必在子组中再次声明。

规则

访问权限只能限制用户组对改对象的访问权限,并不能限制特定用户对某些记录的访问。举例来说,销售人员A拥有对销售单sale.order的访问权限,他能够看到全公司的销售单。很显然,这是现实生活中不可以接受的情况。通常的规则是,销售人员只能看到自己创建的销售单据。在odoo中,这种需求的解决方案就是规则(ir.rule)。

规则的管理在系统设置-技术设置-安全-记录规则中:

规则的设置主要有一下几点:

  • 名称: 规则的名称
  • 对象: 规则应用的对象
  • 访问权限: 规则应用的操作,读、写、创建和删除
  • domain: 规则的主要内容,过虑的条件
  • 组:规则生效的用户组,缺省是全局生效。

前面的例子中,销售人员只能看到自己的销售单,应用的规则domain是:

['|',('user_id','=',user.id),('user_id','=',False)]

"|" 代表的是或关系,"&"代表与关系,一般可以省略。user_id是销售单上的销售人员字段,该domain翻译过来的过滤条件即:过滤出销售单中销售人员是我,或者没有销售人员的单据。

我们在使用权限的过程中,可能会碰到由于安全原因提示有关记录不能被访问的提示。通常是由读取当前对象的字段时关联到了其他对象,而其他对象由于记录规则的原因导致当前用户没有权限访问而提示出错。 如果关联字段时计算字段,那么可以使用sudo提权来规避报错,如果是非计算字段,那么可以在视图中的字段上添加权限组,用来规避当前用户没有权限,odoo视图中没有出现的字段是不会被读取到的,因此也就不存在访问错误。

总结

本章介绍了用户和用户组,以及用户组中的访问权限设置和用户规则,读者可以试着自己创建一个组并设置权限,练习一下吧。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【转载】odoo技术开发白皮书 第一部分 第九章 权限 的相关文章

  • BugKu-Web-矛盾

    BugKu Web 矛盾 题目链接 https ctf bugku com challenges detail id 72 html 考点 PHP弱类型比较漏洞 题目源码分析 num GET num 定义一个num变量用get方法接收 if

随机推荐

  • VUE-鼠标移入到目标区域变成小手模样

    这是测试提的一个需求 当鼠标移入点击更多时 鼠标指针变成小手模样 其实这个东西特别简单 只是用的不多平常 我们只需要给目标区域的style样式中加入 cursor pointer 这个鼠标就好了
  • vue文件无法正常build

    如图所示 run serve后控制台没有报错 但是运行到此处直接结束 解决办法 暴力解决 直接删除node module 再输入cnpm install重新安装依赖 重新安装完成后成功运行
  • CeiT:训练更快的多层特征抽取ViT

    GiantPandaCV导语 来自商汤和南洋理工的工作 也是使用卷积来增强模型提出low level特征的能力 增强模型获取局部性的能力 核心贡献是LCA模块 可以用于捕获多层特征表示 引言 针对先前Transformer架构需要大量额外数
  • vue3 - watchEffect

    watchEffect watch watchEffect 不同点 停止侦听 effect 副作用 watchEffect的执行时机 watchEffect computed 的不同 Vue 3 watch Vue 3 computed特点
  • python金融分析小知识(30)——比较常见的pd.set_option的使用

    Hello 大家好 我是一名新来的金融领域打工人 日常分享一些python知识 都是自己在学习生活中遇到的一些问题 分享给大家 希望对大家有一定的帮助 哈喽大家好 今天我要给大家讲讲在pandas的时候过程中我们会经常遇到的DataFram
  • CSS中的BFC详解

    BFC的特性和作用 1 避免外边距重叠 2 清楚浮动 3 阻止元素被浮动元素覆盖 第三条提供了布局的一种思路 左边盒子宽度固定 右边盒子宽度占满剩余的宽度 左边设置浮动 右边设置overflow hidden即可实现 或者三栏布局 两边固定
  • Ubuntu中Error: Can‘t find Python executable “python“, you can set the PYTHON env variable.

    Ubuntu中在用npm install 时报错 gyp WARN download NVM NODEJS ORG MIRROR is deprecated and will be removed in node gyp v4 please
  • linux下保存git密码

    在使用shell脚本部署项目时 我们经常从gitee或者github拉取代码 每次都输入密码会比较繁琐 这里介绍一下 如何保存git密码 https方式 1 查看服务器是否保存密码git config list 2 邮箱设置 用户名设置 保
  • 基于Javaweb的超市管理系统毕业设计项目源码+数据库+详细设计文档

    超市管理系统 介绍 大学校内超市管理系统 实现收银台 商品分类管理 商品库存管理 商品管理 营收统计等功能 完整代码下载地址 基于Javaweb的超市管理系统 软件架构 使用说明 项目导入eclipse 配置tomcat jdk sql 导
  • 使用scrapy框架进行爬虫时,报出异常:NotImplementedError: Test1Spider.parse callback is not defined

    这种错误类型今天第一次使用Scrapy框架 就出现了 找了很多博客中的解决方法 还是不能访问 改了一下execute py文件的位置就ok了 如图 书上说这三个位置放置execute py文件都可以 我把文件放在第二个目录下 就不会抛出异常
  • 从辩证的角度看待chatGPT,我们该如何对待?

    从辩证的角度 看待chatGPT 0 什么是ChatGPT 客观阐述 1 通过唯物辩证法的五对基本范畴进行分析 1 0 内容与形式 1 1 现象和本质 1 2 原因与结果 1 3 必然与偶然 1 4 现实与可能 2 使用ChatGPT会给我
  • SPADE(GauGAN)代码运行方法

    SPADE运行方法 写在前面 为什么Pix2PixHD和SPADE都不用RGB作为输入 如何运行SPADE 可能遇到的问题 2022 04 28更 如何控制合成风格 2022 07 30更 contain dontcare label参数
  • 暗影精灵5怎么调风扇转速_遗憾与真香并存的性价比产品——暗影精灵6 AMD

    惠普暗影精灵6 AMD作为一台正面与联想拯救者R7000P对线的游戏本 自有消息以来就被玩家们寄托了很高的希望 纵然随着暗影精灵6 AMD的发布 大家对其期待值有所降低 但在如今游戏本集体无货的情况下它也是一个不错的选择 本文基于目前拿到的
  • 数据结构 算法大全 入门篇

    说到数据结构是什么 我们得先来谈谈什么叫数据 正所谓 巧妇难为无米之炊 再强大的计算机 也是要有 米 下锅才可以干活的 否则就是一堆破铜烂铁 这个 米 就是数据 数据 是描述客观事物的符号 是计算机中可以操作的对象 是能被计算机识别 并输入
  • vscode配置remote ssh

    1 安装插件 vscode配置remote ssh Hello wshuo的博客 CSDN博客 remote ssh vscode 设置界面 右键最左边tab栏 主体 vscode 插件 Remote SSH Linux主体 vscode
  • 【Complex-YOLO: 点云实时目标检测】

    Complex YOLO 点云实时目标检测 前言 要点分析 具体算法分析 点云转化鸟瞰图 提取特征 B Box损失回归 前言 Complex YOLO 论文中介绍是一种仅在点云上进行的最先进的实时3D目标检测网络 借鉴了yolo v2的主干
  • Java语言实现word转PDF(10分钟解决)

    前言 经常做OA办公项目的同学一定和我一样被各种线上的office操作整疯了 基本上涉及到Java操作office的时候就会想到POI和openoffice 这两种方案都是需要找各种jar包 然后用里面繁杂的api 关键是做出来的文件格式有
  • ORA-28002 & PASSWORD_LIFE_TIME & PASSWORD_GRACE_TIME

    Normal 0 7 8 磅 0 2 false false false EN US ZH CN X NONE PASSWORD LIFE TIME 设置的是数据库开始报告ORA 28002密码要过期的时间 PASSWORD GRACE T
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • 【转载】odoo技术开发白皮书 第一部分 第九章 权限

    转载 http book odoomommy com chapter1 README8 html 第九章 权限 Odoo的权限管理 从粗到细可以大概分为四个等级 对象级 视图级 字段级 记录级 什么意思呢 总结起来大概如下面的描述 对象级