Odoo安裝教程11-創建新的插件模塊之設置訪問權限

設置訪問權限

在加載服務時,你可能會注意到輸出日誌中有一條警告信息:
The model library.book has no access rules, consider adding one.
提示消息已經很明確了,我們的新模型沒有訪問規則, 所以任何人都可使用。我們已爲應用添加了安全組,現在就爲模塊授權。
“ 小貼士: 在 Odoo 12 以前, admin 可自動訪問所有數據模型,它是一個不受權限控制的超級用戶。在 Odoo 12 中則不再如此,需要在新模型中設置 ACL 纔對 admin 可見。 ”

添加訪問權限控制

Technical > Security >
Access Rights:這裏可以看到一些模型的 ACL(Access Control List),表示允許每個安全組對記錄的操作。這一信息需要通過模塊中的數據文件提供,然後載入 ir.model.access 模型。我們將爲 employee 組添加該模型的所有權限,內部用戶是幾乎所有人隸屬的基本權限組。
“ 注意: Odoo 12 的修改User 表單現在有一個用戶類型,僅在開啓開發者模式時顯示。它允許互斥的幾個選項:內部用戶, portal 門戶用戶(外部用戶如客戶)和 public 公共用戶(網站匿名訪客)。這一修改用於避免把內部用戶放到 portal 或 public 組中一類的錯誤配置,那樣會導致權限的喪失。 ”權限通過 security/ir.model.access.csv 文件來實現,添加該文件並加入如下內容

id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_book_user,BookUser,model_library_book,library_group_user,1,0,0,0
access_book_manager,BookManager,model_library_book,library_group_manager,1,1,1
,1

注:應注意該文件第一行後不要留有空格,否則會導致報錯
文件名必須與要載入的模型對應,第一行爲列名, CSV 文件中有如下列:
⚫ id 是記錄的外部標識符(也稱爲 XML ID),需在模塊中唯一
⚫ name 是描述性標題,僅在保證唯一時提供有用信息
⚫ model_id 是賦權模型的外部標識符,模型有 ORM 自動生成的 XML ID,對於
library.book,標識符爲 model_library_book
⚫ group_id 指明授權的安全組,我們給前文創建的安全組授權: library_group_user 和
library_group_manager
⚫ perm_…字段標記 read 讀, write 寫, create 創建, 或 unlink 刪除權限,我們授予普通用戶
讀權限、管理員所有權限
還應記得在__manifest__.py 的 data 屬性中添加對新文件的引用,修改後如下:
'data': [
'security/library_security.xml',
'security/ir.model.access.csv',
'views/library_menu.xml',
],老規矩升級模塊讓修改生效,此時警告信息就不見了。我們通過 admin 登錄來檢測權限是否正確, admin 屬於圖書管理員組

行級權限規則

我們知道默認 active 標記爲 False 的記錄不可見,但用戶在需要時可使用過濾器來訪問這些
記錄。假設我們不希望普通圖書用戶訪問無效圖書,可通過記錄規則來實現,即定義過濾器來限制某權限組所能訪問的記錄。這位於 Settings > Technical > Security > Record Rules。
記錄規則在 ir.rule 中定義,和往常一樣我們選擇一個唯一名稱。還應獲取操作的模型及使用權限限制的域過濾器。域過濾器使用 Odoo 中常用的元組列表,在第八章業務邏輯將講解域表達式語法。
通常,規則應用於指定安全組,我們這裏應用的是僱員組。如果沒有指定的安全組,則應用於全局(global 字段自動設爲 True)。全局規則不同,它們做的限制非全局規則無法重載。要添加記錄規則,需編輯 security/library_security.xml 文件添加如下代碼:

<data noupdate="1">
<record id="book_user_rule" model="ir.rule">
<field name="name">Library Book User Access</field>
<field name="model_id" ref="model_library_book" />
<field name="domain_force">
[('active','=',True)]
</field>
<field name="groups" eval="[(4,ref('library_group_user'))]" />
</record>
</data>

記錄規則位於元素中,表示這些記錄在模型安裝時會被創建,但在模型更新時不會被重寫。這麼做是允許對規則在後面做自定義但避免在執行模型升級時自定義內容丟失。
“ 小貼士: 開發過程 noupdate=” 1″會帶來麻煩,因爲要修復規則時模塊更新不會在數據庫中重寫數據。所以在開發時可以修改爲 noupdate=” 0″來讓數據達到預期結果。 ”
在 groups 字段中,會發現有一個特殊表達式,這是一個帶有特殊語法的 one-to-many 關聯字段。元組(4, x)表示 x 應添加到記錄中, 此處 x 爲一個標記爲 base.group_user 的內部用戶組引用。針對多個字段的這種特殊語法在第六章模型中探討。

更多教程:https://www.erpdaxue.cn/odoo/odoo-teach/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章