除了使用自定義代碼管理訪問外,Odoo主要以數(shù)據(jù)驅(qū)動(dòng)的方式進(jìn)行權(quán)限管理。這種機(jī)制通過組與特定用戶相關(guān)聯(lián):用戶屬于一個(gè)或多個(gè)組,權(quán)限與組關(guān)聯(lián),從而將權(quán)限應(yīng)用于用戶。
模型權(quán)限
通過ir.model.access的記錄行進(jìn)行管理,定義模型的訪問權(quán)限。每個(gè)訪問權(quán)限項(xiàng)對(duì)應(yīng)一個(gè)模型,組(一個(gè)或者沒有)以及相應(yīng)的權(quán)限。
模型權(quán)限是加法的,對(duì)于給定的模型,用戶的訪問權(quán)限是用戶所在的全部組的權(quán)限的集合。例如:用戶屬于兩個(gè)組,一個(gè)組有寫入權(quán)限,另外一個(gè)組有刪除權(quán)限,則用戶擁有寫入和刪除權(quán)限。
如果模型權(quán)限未指定組,則訪問權(quán)限適用于所有用戶,否則僅適用于給定組的成員??捎玫臋?quán)限包括:
perm_create:創(chuàng)建
perm_read:閱讀和搜索
perm_write:更新已有記錄
perm_unlink:刪除已有記錄
記錄行規(guī)則
記錄行規(guī)則是對(duì)記錄行的操作權(quán)限(創(chuàng)建、讀取、更新和刪除)控制。在應(yīng)用了模型權(quán)限后再應(yīng)用記錄行規(guī)則。記錄行規(guī)則的定義包括:
- 規(guī)則對(duì)應(yīng)的模型權(quán)限
- 規(guī)則適用的一組權(quán)限(例如,如果設(shè)置了
perm_read,則只有在讀取記錄時(shí)才會(huì)檢查該規(guī)則) - 規(guī)則適用的一組用戶組,如果沒有指定組,則該規(guī)則是全局的
- 規(guī)則適用的記錄行,用domain來定義,符合domain規(guī)則的可訪問,不符合的則不能訪問。這里的domain有兩個(gè)上下文可以使用:
user是當(dāng)前用戶的記錄行,time是時(shí)間模塊。
全局規(guī)則(規(guī)則中未指定組)和組規(guī)則(規(guī)則中指定了組)的使用方式截然不同: - 全局規(guī)則是減法的,必須全部匹配才能訪問記錄
- 組規(guī)則是加法的,其中任何一個(gè)匹配(并且全部的全局規(guī)則都匹配)就能訪問記錄
這意味著第一個(gè)組規(guī)則限制記錄的訪問,但是其它的所有組規(guī)則都在擴(kuò)展訪問。而全局規(guī)則是每一個(gè)規(guī)則都在限制記錄的訪問(或者不起作用)。
警告
記錄行規(guī)則和模型權(quán)限對(duì)于管理員用戶無效,管理員用戶擁有完全權(quán)限
字段權(quán)限
這個(gè)是在7.0版本之后新增的。ORM的Field有一個(gè)groups屬性,這個(gè)屬性可以定義一個(gè)組的列表(以逗號(hào)分隔的標(biāo)識(shí)符)。如果當(dāng)前用戶不是這個(gè)組列表中的任一組成員,那當(dāng)前用戶不能訪問這個(gè)字段:
- 受限制的字段將在視圖請(qǐng)求中被自動(dòng)移除
- 受限制的字段將在
fields_get()請(qǐng)求中被移除 - 如果嘗試(顯示的)讀取或?qū)懭胧芟拗谱侄螘?huì)導(dǎo)致訪問錯(cuò)誤
工作流流轉(zhuǎn)規(guī)則
工作流流轉(zhuǎn)可以限制在一個(gè)特定的組中,組外的用戶無法觸發(fā)轉(zhuǎn)換。