Chapter 4: Security - A Brief Introduction

In the previous chapter, we created our first table intended to store business data. In a business application such as Odoo, one of the first questions to consider is who1 can access the data. Odoo provides a security mechanism to allow access to the data for specific groups of users.

安全性的主题在更多细节上有所涵盖 限制数据访问。本章旨在涵盖我们新模块所需的最低限度。

数据文件(CSV)

Odoo is a highly data driven system. Although behavior is customized using Python code, part of a module’s value is in the data it sets up when loaded. One way to load data is through a CSV file. One example is the list of country states which is loaded at installation of the base module.

"id","country_id:id","name","code"
state_au_1,au,"Australian Capital Territory","ACT"
state_au_2,au,"New South Wales","NSW"
state_au_3,au,"Northern Territory","NT"
state_au_4,au,"Queensland","QLD"
...
  • id is an external identifier. It can be used to refer to the record (without knowing its in-database identifier).

  • country_id:id refers to the country by using its external identifier.

  • name is the name of the state.

  • code is the code of the state.

这三个字段在 res.country.state 模型中 定义

按照惯例,导入数据的文件位于模块的 data 文件夹中。当数据与安全相关时,它位于 security 文件夹中。当数据与视图和操作相关时(我们稍后会介绍),它位于 views 文件夹中。此外,所有这些文件都必须在 __manifest__.py 文件的 data 列表中声明。我们的示例文件在 基础模块的清单中定义

还要注意的是,数据文件的内容只有在安装或更新模块时才会被加载。

警告

数据文件按照它们在 __manifest__.py 文件中的顺序依次加载。这意味着如果数据 A 引用了数据 B,你必须确保 BA 之前加载。

In the case of the country states, you will note that the list of countries is loaded before the list of country states. This is because the states refer to the countries.

为什么这对于安全很重要?因为模型的所有安全配置都是通过数据文件加载的,正如我们将在下一节中看到的那样。

访问权限

参考: 与此主题相关的文档可以在 访问权限 中找到。

注解

目标:在本节结束时,以下警告不应再出现:

WARNING rd-demo odoo.modules.loading: The models ['estate.property'] have no access rules...

当模型上没有定义访问权限时,Odoo 会确定没有用户可以访问数据。甚至在日志中通知此信息:

WARNING rd-demo odoo.modules.loading: The models ['estate.property'] have no access rules in module estate, consider adding some, like:
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink

访问权限被定义为模型 ir.model.access 的记录。每个访问权限与一个模型、一个组(或全局访问时没有组)和一组权限相关联:创建、读取、写入和删除2。这些访问权限通常在名为 ir.model.access.csv 的 CSV 文件中定义。

这是我们之前的 test_model 的一个例子:

id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink
access_test_model,access_test_model,model_test_model,base.group_user,1,0,0,0
  • id is an external identifier.

  • nameir.model.access 的名称。

  • model_id/id 指的是适用于访问权限的模型。引用模型的标准方式是 model_<model_name>,其中 <model_name> 是模型的 _name,将 . 替换为 _。看起来很繁琐?确实如此…

  • group_id/id refers to the group which the access right applies to.

  • perm_read,perm_write,perm_create,perm_unlink: read, write, create and unlink permissions

Exercise

添加访问权限。

在适当的文件夹中创建 ir.model.access.csv 文件,并在 __manifest__.py 文件中定义它。

给组 base.group_user 赋予读取、写入、创建和删除权限。

提示:日志中的警告信息已经给出了大部分的解决方案 ;-)

重启服务器,警告信息应该已经消失了!

It’s now time to finally interact with the UI!

1

指的是哪个Odoo用户(或用户组)

‘unlink’ 相当于 ‘delete’