第五章:安全性 - 簡介?

上一章節 中,我們創建了第一個用于存儲業務數據的表格。在像Odoo這樣的業務應用中,首先要考慮的一個問題是誰可以訪問數據。Odoo提供了一個安全機制,允許特定用戶組訪問數據。

更詳細的安全主題請參考 限制數據訪問 。本章旨在介紹我們新模塊所需的最低安全要求。

數據文件(CSV)?

Odoo 是一個高度數據驅動的系統。雖然行為是使用 Python 代碼定制的,但模塊的一部分價值在于加載時設置的數據。一種加載數據的方式是通過 CSV 文件。一個例子是 國家州列表 <https://github.com/odoo/odoo/blob/16.0/odoo/addons/base/data/res.country.state.csv> _,它在 ` base 模塊安裝時加載。

"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 是一個 外部標識符 。它可以用來引用記錄(而不需要知道其在數據庫中的標識符)。

  • country_id:id 通過使用其 外部標識符 來引用國家。

  • name 是狀態的名稱。

  • code 是該州的代碼。

這三個字段在 res.country.state 模型中被 定義。

按照慣例,導入數據的文件位于模塊的 data 文件夾中。當數據與安全相關時,它位于 security 文件夾中。當數據與視圖和操作相關時(我們稍后會講到),它位于 views 文件夾中。此外,所有這些文件都必須在 __manifest__.py 文件的 data 列表中聲明。我們的示例文件在 基礎模塊清單中定義了。

還要注意的是,數據文件的內容只有在安裝或更新模塊時才會被加載。

警告

數據文件按照它們在 __manifest__.py 文件中的順序依次加載。這意味著,如果數據 A 引用了數據 B ,則必須確保在加載 A 之前先加載 B 。

在國家州的情況下,您會注意到 `國家列表<https://github.com/odoo/odoo/blob/e8697f609372cd61b045c4ee2c7f0fcfb496f58a/odoo/addons/base/__manifest__.py#L22>`__`國家州列表<https://github.com/odoo/odoo/blob/e8697f609372cd61b045c4ee2c7f0fcfb496f58a/odoo/addons/base/__manifest__.py#L29>`__ 之前被加載。這是因為州引用了國家。

為什么這對于安全很重要?因為模型的所有安全配置都是通過數據文件加載的,正如我們將在下一節中看到的那樣。

訪問權限?

參考 : 有關此主題的文檔可以在 訪問權限 中找到。

注解

目標 :本節結束后,以下警告不應再出現:

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 是一個 外部標識符 。

  • nameir.model.access 的名稱。

  • model_id/id 指的是應用于訪問權限的模型。引用模型的標準方式是 model_<model_name> ,其中 <model_name> 是模型的 _name ,并將 . 替換為 _ ??雌饋砗苈闊??確實如此…

  • group_id/id 指的是應用于訪問權限的組。

  • perm_read,perm_write,perm_create,perm_unlink : 讀取、寫入、創建和刪除權限

Exercise

添加訪問權限。

在適當的文件夾中創建 ir.model.access.csv 文件,并在 __manifest__.py 文件中定義它。

將讀取、寫入、創建和刪除權限授予組 base.group_user 。

提示:日志中的警告信息已經給出了大部分的解決方案 ;-)

重啟服務器,警告信息應該已經消失了!

現在是時候最終 與UI交互 了!

1

指的是哪個Odoo用戶(或用戶組)

‘unlink’ 相當于 ‘delete’