首先引用博主<郭歡歡>整理的一篇文章<Odoo權限機制>
然后在此基礎上,自己也研究了一番,有一定的收獲。
現整理如下:
- 從客戶端上理解:
首先我們要知道我們使用權限控制的目的是什么?
1、為了解決只有系統最開始創建的用戶(管理員級別)能訪問並操作相應的模型;
2、為了解決不同的用戶類型,訪問(可見)不同的單據內容和操作控制;
<------------------------------------------------------------------------------->
為了解決上述問題,我們先要了解幾個內容:
1、群組:為了划分不同級別的用戶(幾乎所有的控制分類,理論最終步驟都在群組部分實現);
2、記錄規則:設置單據的訪問類別(如:每個人都只能看到自己的單據,管理員能看到所有的單據);
3、訪問控制:設置單據的訪問權限(如:增刪改查等數據操作);
<------------------------------------------------------------------------------->
解決第一個問題的思路是:
1、只要我們創建的模型有對應全局用戶訪問操作權限(根據自己的業務選擇實現)即可;
實現方法可以是界面上添加(缺點是如果要進行升級模塊,界面上添加的就會被重置,升級后添加的權限控制就會失效)或在代碼里寫死;
- 先講怎么從界面上實現:
1、直接在debug(調試模式)下進入設置==>技術==>安全==>訪問控制列表;
2、添加一條記錄:在對象下輸入你要寫入權限的模型名稱,名字任意命名(建議命名稍微有意義,並且能夠自己記住),勾上需要的相應訪問權限(增刪改查),保存刷新即可;
注:群組可選,如果需要相應的群組訪問則可選上。
- 代碼實現如下:
1、模塊的目錄下創建一個security文件夾;
2、在security文件夾下創建ir.model.access.csv文件;
3、寫入記錄:
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
寫入的內容可以找每次執行模塊升級時,后台日志推薦的rule寫法,例如
The model cus_args.sync_task has no access rules, consider adding one. E.g. access_cus_args_sync_task,access_cus_args_sync_task,model_cus_args_sync_task,,1,0,0,0
對於cus_args.sync_task模塊,odoo推薦使用以下記錄。
<access_cus_args_sync_task,access_cus_args_sync_task,model_cus_args_sync_task,,1,0,0,0>
值得注意的是,這個<group_id>規則是指定該記錄需要用到此訪問規則的群組,<group_id:id>默認可以沒有值(沒有指定群組,則對應全局)。
4、在__manifest__.py的data添加上該文件(和添加xml是一樣的方式),升級就可以了。
<------------------------------------------------------------------------------->
現解決第二個問題,稍微復雜點:
首先我們假設:有個模型叫銷售單<sales.order>,模型所在文件夾<sale_dev>要求是每個銷售員只能看到他自己的銷售單據,管理員能看到所有銷售員的銷售單據。
- 還是先講怎么只在界面上就能實現
1、既然由兩個訪問類別,那么肯定由兩個訪問群組在控制:創建<銷售員>群組、創建<銷售管理>群組;
注:創建群組時,應用程序(第一個選項)是可選項,兩個群組應該使用的相同的應用程序(銷售中心)。當然不填寫這一欄目也沒有關系,只是如果想要添加的群組出現在用戶設置的界面,可以寫一個上去,就會出現在用戶==>訪問權界面下。
2、訪問控制列表處創建一條記錄(假設銷售員和管理員對於銷售單都能增刪改查操作,如果不是,可以針對自己的業務進行添加):
name:<sales_order_control>
model_id: <sales.order>
group_id: <銷售員>
注:model_id:指的是對象,填寫模型名就可以;group_id:指的是群組
1)group_id選擇銷售員,在銷售管理群組下繼承一下銷售員就可以將此訪問控制寫入到銷售管理群組下,所以不用擔心銷售管理會沒有訪問控制權限。
2)此訪問控制記錄直接在群組那里也可以添加
3、創建屬於關系的訪問類別,算是界面上比較關鍵的地方:
在設置==>技術==>安全==>記錄規則 添加
1、創建一條銷售員記錄(銷售員只能訪問屬於他的銷售單據)
1)name:<sales user>
2)model_id:<sales.order>
3)Domain:[('user_id','=',user.id)]
4)group_id:銷售員
注:Domain里面寫的就是一個限制方式,這里寫的意思是,要求在sales.order模型中,用戶id:user_id等於當前用戶user的id:user.id。這兩個id是一個東西,但在這里的意義不是一樣的,一個是模型對象的,一個是當前用戶的,可以理解下。
2、創建一條管理員的記錄(銷售管理能訪問銷售對應所有的銷售單)
1)name:<sales manage>
2)model_id:<sales.order>
3)Domain:[(1, '=', 1)]
4)group_id:銷售管理
注:Domain里寫的其實很好理解,1=1這個就是恆等式嘛,永遠相等並成立。說的就是在銷售管理群組下的用戶,都能訪問當前模型的記錄。
- 代碼實現
1、添加一條群組對應的應用記錄(可以理解為該群組是為哪一個應用(模塊)寫的)--ps:后來在界面上,發現這個記錄對於一條群組記錄來講,並不是一條必填項,此記錄的存在只是為了區分模塊之間的權限辨識,並且可以顯示在用戶==>訪問權里面;
<record model="ir.module.category" id="module_category_sale_center"> <field name="name">*</field> <field name="description">*</field> <field name="sequence">*</field> </record>
model一定要指定<ir.module.category>,id使用odoo的命名方式:module_category_ 加上模型對應需要合並在一起的模塊文件夾名或者py文件名稱(源碼都有見過,我也不太分得清了),name、description、sequence可以任意自定。其中name是群組的應用名稱,description描述、sequence用作設置群組在設置--用戶界面的位置
這里使用和界面一致的命名(name:<銷售中心>、description:<>、sequence:<>)
2、添加群組記錄(這個就是ir.model.access.csv上記錄需要關聯的對象了)
<銷售員>
<record id="group_sale_user" model="res.groups"> <field name="name">Sales User</field> <field name="category_id" ref="module_category_sale_center"/> <field name="implied_ids" eval="[(4, ref('base.group_user'))]"/> </record>
<銷售管理>
<record id="group_sale_mange" model="res.groups"> <field name="name">Sales Manage</field> <field name="category_id" ref="module_category_sale_center"/> <field name="implied_ids" eval="[(4, ref('base.group_sale_user'))]"/> </record>
值得注意的是<category_id>是上一個寫的<model="ir.module.category">對應的id;<implied_ids>則是需要繼承的群組,意思是加入該群組則默認加入繼承的群組。
3、添加ir.model.access.csv記錄
最上面的步驟是一致的,唯一需要區別注意的是:group_id:填寫2步驟的對應的群組,填寫后才會有在群組==>訪問控制界面出現相關記錄。
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_sale_order_user,sale.order,model_sale_order,sale_dev.group_sale_user,1,1,1,0
access_sale_order_manage,sale.order,model_sale_order,sale_dev.group_sale_manage,1,1,1,0
4、添加記錄規則
<屬於自己的銷售單據>
<record id="ir_rule_sale_order_user" model="ir.rule"> <field name="name">Belongs to self</field> <field name="model_id" ref="sale_dev.model_sales_order"/> <field name="domain_force">[('user_id','=',user.id)]</field> <field name="groups" eval="[(4, ref('sale_dev.group_sale_user'))]"/> </record>
<管理員可見的所有銷售單據>
<record id="ir_rule_sale_order_manage" model="ir.rule"> <field name="name">All sales order</field> <field name="model_id" ref="sale_dev.model_sales_order"/> <field name="domain_force">[(1, '=', 1)]</field> <field name="groups" eval="[(4, ref('sale_dev.group_sale_manage'))]"/> </record>
注:需要注意的地方model_id是需要添加記錄規則的對應模型、groups:則是需要關聯的群組。
做完此步驟,檢查一下關聯關系。
重啟服務,升級模塊!
在不同的群組中添加對應的用戶,使用不同的用戶驗證。沒有意外的話肯定是現實的!
至此,以上關於群組使能的訪問控制的操作步驟已全部結束,由於第一次寫這類文章,表達不正確的地方請指正!
<------------------------------------------------------------------------------->
還有一些只想通過菜單級別控制訪問的:
有如下規則:
1)菜單只能控制可見,不能限制訪問,如果有一個menu id,也照樣可以訪問;
2)菜單控制的訪問,還有一些坑在里面。<額外的權利/技術特性>(這個是debug模式下才會顯示有的東西)一定不要隨便用
怎么使用:
1)創建群組;
2)將需要控制顯示的菜單添加到菜單列表中;
3)添加用戶(就只用添加的用戶能看到控制顯示的菜單);
<------------------------------------------------------------------------------->
~持續待完善~