摘要:今天這個(gè)系列教程即將迎來它的最后一篇內(nèi)容了,我們將要來學(xué)習(xí)中權(quán)限相關(guān)的內(nèi)容。在的權(quán)限管理體系中,同樣也有用戶組這一概念的存在,和其他框架如可以說大同小異。通常和權(quán)限相關(guān)的內(nèi)容,我們都會(huì)在模塊的目錄下進(jìn)行定義,記錄集規(guī)則的定義自然也不例外。
在今年的情人節(jié)(2018.02.14)那天,我寫了一篇博客說即將要開一個(gè)坑,也就是大家在看的這個(gè)系列的教程。今天這個(gè)系列教程即將迎來它的最后一篇內(nèi)容了,我們將要來學(xué)習(xí) Odoo 中權(quán)限相關(guān)的內(nèi)容。
用戶組在多用戶系統(tǒng)中,并不是所有數(shù)據(jù)都是可以開放給全部用戶的,所以在多用戶系統(tǒng)中,權(quán)限管理是非常重要的一環(huán)。通常我們會(huì)根據(jù)業(yè)務(wù)和組織架構(gòu)對用戶進(jìn)行分組管理,也就是我們常說的用戶組或角色組,然后再根據(jù)用戶組對用戶所能接觸到的數(shù)據(jù)內(nèi)容進(jìn)行控制。
在 Odoo 的權(quán)限管理體系中,同樣也有用戶組這一概念的存在,和其他框架(如 Django)可以說大同小異?;氐轿覀兊?Todo 應(yīng)用里來,從一開始我們就是用的超級(jí)管理員賬戶 admin 登錄和操作的,這在任何生產(chǎn)環(huán)境和測試環(huán)境里都是不允許出現(xiàn)的,但是在前面的教程里,我們都沒有提到過賬戶和權(quán)限相關(guān)的內(nèi)容,是為了讓教程能一路走下來,所以我們今天就來糾正這個(gè)錯(cuò)誤。
在我們的 Todo 應(yīng)用中,假設(shè)有「用戶」和「管理員」兩個(gè)用戶組,普通用戶可以創(chuàng)建、修改和刪除自己創(chuàng)建的待辦事項(xiàng),而管理員除了擁有普通用戶的操作權(quán)限外,還可以創(chuàng)建、修改和刪除分類數(shù)據(jù)。
現(xiàn)在我們就來看看應(yīng)該如何定義這兩個(gè)用戶組,和定義其他數(shù)據(jù)一樣,我們同樣需要在 xml 文件中定義用戶組數(shù)據(jù),找到模塊下的 security 目錄,然后創(chuàng)建一個(gè) todo_security.xml 文件,用于定義我們的用戶組數(shù)據(jù):
待辦事項(xiàng) 用戶 管理員
這里總共有 3 條記錄,分別是 Todo 模塊分類(ir.module.category)和「用戶」及「管理員」兩個(gè)用戶組(res.groups),重點(diǎn)來看看用戶組里各個(gè)字段所代表的含義:
category_id:該用戶組所屬的模塊分類
implied_ids:在當(dāng)前用戶組下的用戶,同時(shí)加入該字段所指定的用戶組中
users:該字段所指定的用戶默認(rèn)被加入到當(dāng)前用戶組中
在上面的記錄中,還有兩個(gè)引用(ref),分別是 base.group_user 基礎(chǔ)用戶組和 base.user_root 管理員賬戶。
別忘了把 "security/todo_security.xml" 加入到 __manifest__.py 的 data 列表中,將它放在 # "security/ir.model.access.csv" 這一行的上面,然后升級(jí)更新模塊之后打開設(shè)置菜單下的「用戶」菜單,打開管理員賬戶 Administrator 的表單視圖。
這時(shí)我們可以看到在「Application Accesses」下出現(xiàn)了我們剛剛創(chuàng)建的「待辦事項(xiàng)」模塊分類,進(jìn)入編輯模式后,可以看到有「用戶」和「管理員」兩個(gè)選項(xiàng)
可以發(fā)現(xiàn)超級(jí)管理員賬戶已經(jīng)默認(rèn)被分配到了待辦事項(xiàng)分類下的「管理員」組中了,這也和我們前面說的 users 字段所表現(xiàn)的行為是一致的,再返回列表,打開 Demo User 這個(gè)賬戶看看,是不是并沒有加入我們創(chuàng)建的用戶組中的任何一個(gè)呢 :)
用戶組權(quán)限用戶組創(chuàng)建好了之后,事情遠(yuǎn)遠(yuǎn)還沒有結(jié)束,因?yàn)槲覜]并沒有為這兩個(gè)用戶組分配相關(guān)數(shù)據(jù)的操作權(quán)限。那如果我們現(xiàn)在創(chuàng)建一個(gè)新的用戶,并且加入到任意的用戶組中,然后登錄訪問系統(tǒng),會(huì)發(fā)生什么呢?實(shí)踐出真知,我們來創(chuàng)建一個(gè) test 用戶并且分配到「用戶」組中,然后登錄看看會(huì)發(fā)生什么
注:修改新創(chuàng)建的賬戶密碼,打開 Action 下拉菜單,點(diǎn)擊 Change Password 即可修改
打開隱身窗口或者在另一個(gè)瀏覽器上登錄,你會(huì)看到頁面上什么都沒有,為什么會(huì)這樣?
不要感到迷惑,這確實(shí)是因?yàn)槲覀儧]有給用戶組分配任何數(shù)據(jù)的操作權(quán)限導(dǎo)致的,用戶沒有對數(shù)據(jù)的讀寫權(quán)限,自然就無法查看到相關(guān)的內(nèi)容了。在 Odoo 中給用戶組分配權(quán)限,是以模型為單位的,也就是說只有某個(gè)用戶組被分配了對應(yīng)模型的權(quán)限之后,該用戶組內(nèi)的用戶才能操作對應(yīng)模型下的數(shù)據(jù)。用戶組權(quán)限的定義是以 .csv 格式文件存儲(chǔ)的,在創(chuàng)建模塊時(shí)默認(rèn)已經(jīng)生成了一個(gè)權(quán)限記錄文件 security/ir.model.access.csv,打開它我們可以看到里面有一條記錄,這是在創(chuàng)建模塊時(shí)自動(dòng)生成的,可以看到里面有 8 個(gè)字段,分別代表的含義如下
id:這條權(quán)限記錄的 id,可以類比為 xml_id
name:權(quán)限記錄的名稱
model_id:id:要配置權(quán)限的模型的外部 ID (以 model_ 開頭)
group_id:id:應(yīng)用此條權(quán)限配置的用戶組的 id,若為空則默認(rèn)對所有用戶組生效
perm_read:讀取記錄的權(quán)限,1 為擁有該權(quán)限,0 為不分配該權(quán)限
perm_write:編輯更新記錄的權(quán)限,取值同上
perm_create:創(chuàng)建新記錄的權(quán)限,取值同上
perm_unlink:刪除記錄的權(quán)限,取值同上
如果不理解也沒關(guān)系,我們先來給「用戶」組添加對模型 todo.task 的操作權(quán)限,通過實(shí)例會(huì)更容易理解:
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_todo_task_user,todo.task.user,model_todo_task,group_todo_user,1,1,1,1
我們在這里為「用戶」組(group_todo_user)添加了對 todo.task 待辦事項(xiàng)模型的讀寫創(chuàng)建和刪除四個(gè)操作的權(quán)限,然后打開 __manifest__.py 并將 # "security/ir.model.access.csv" 這行的注釋取消掉,然后升級(jí)更新模塊,然后刷新剛剛登錄的 test 賬戶的界面,是不是可以看到有數(shù)據(jù)了呢
終于不是空空如也的頁面了,可是有沒有覺得哪里不對呢?是的,這個(gè)賬戶是新的賬戶,但是卻看到了超級(jí)管理員創(chuàng)建的數(shù)據(jù),拋開這個(gè)問題不管先,這個(gè)我們后面會(huì)再來解決。現(xiàn)在我們要做的是創(chuàng)建一條新的記錄,看看能不能成功創(chuàng)建一條新的記錄
Oops! 在選擇分類的時(shí)候突然彈出了個(gè)錯(cuò)誤,這是怎么回事呢,來仔細(xì)看看錯(cuò)誤提示的內(nèi)容
對不起,你沒有權(quán)限訪問該文檔。如果你認(rèn)為這是一個(gè)錯(cuò)誤,請聯(lián)系系統(tǒng)管理員。
(文檔模型:todo.category)
看起來問題并不在我們的待辦事項(xiàng)(todo.task)模型上,而是在分類模型上,我們剛剛分配用戶組權(quán)限時(shí)只分配了待辦事項(xiàng)模型的權(quán)限,所以當(dāng)用戶視圖讀取分類模型的數(shù)據(jù)時(shí),就會(huì)提示沒有權(quán)限訪問。解決這個(gè)問題同樣很簡單,只需要加上分類模型的權(quán)限即可
access_todo_category_user,todo.category.user,model_todo_category,group_todo_user,1,0,0,0
將上面的權(quán)限定義加到 ir.model.access.csv 文件的行末,然后升級(jí)更新模塊后再次創(chuàng)建,這次終于成功創(chuàng)建起來了。
對權(quán)限分配這部分內(nèi)容的認(rèn)識(shí)有沒有比剛開始更開始要清晰一些了呢?那我們這里就留一個(gè)小作業(yè)吧:
為用戶組「管理員」添加權(quán)限,允許該用戶組下的用戶對分類模型進(jìn)行管理,包括創(chuàng)建、刪除、更新和讀取
如果不知道寫得是否正確,可以參考源碼中的我的寫法。
記錄集權(quán)限用戶組權(quán)限是粒度較粗的權(quán)限控制方式,它只能針對于某一個(gè)模型的全部記錄應(yīng)用相關(guān)權(quán)限配置,但是某些時(shí)候,我們會(huì)需要粒度更細(xì)的權(quán)限控制方式。一個(gè)現(xiàn)成的例子就是上一節(jié)中,我們用新建的測試賬戶登錄后,可以看到超級(jí)管理員所創(chuàng)建的待辦事項(xiàng)的記錄,這是不合理的,一個(gè)普通的用戶,應(yīng)該只能看到和操作他所創(chuàng)建的記錄。
值得慶幸的是,Odoo 為我們提供了基于記錄集的權(quán)限控制方式,我們可以很輕松地根據(jù)業(yè)務(wù)需求編寫相應(yīng)的規(guī)則,將權(quán)限控制的粒度精細(xì)到具體的記錄上。為了體現(xiàn)記錄集權(quán)限的用法,我們將假設(shè)在我們的 Todo 應(yīng)用中,普通用戶只能讀取和操作由自己創(chuàng)建的待辦事項(xiàng),而管理員則可以查看和刪除(但不能修改)所有用戶創(chuàng)建的待辦事項(xiàng)。
通常和權(quán)限相關(guān)的內(nèi)容,我們都會(huì)在模塊的 security 目錄下進(jìn)行定義,記錄集規(guī)則的定義自然也不例外。我們創(chuàng)建一個(gè) ir_rule.xml 的文件,然后添加記錄集規(guī)則的定義
待辦事項(xiàng)規(guī)則 - 用戶 [("create_uid", "=", user.id)] 待辦事項(xiàng)規(guī)則 - 管理員 [("create_uid", "!=", user.id)]
之后要做的事當(dāng)然就是把 "security/ir_rule.xml" 添加到 __manifest__.py 的 data 中啦,再來就是升級(jí)更新模塊,現(xiàn)在刷新瀏覽器,應(yīng)該看不到其他用戶創(chuàng)建的待辦事項(xiàng)記錄了,完美達(dá)成目的~現(xiàn)在讓我們回到管理員賬戶所在的瀏覽器,然后創(chuàng)建一個(gè)新的賬戶,并添加到「管理員」組內(nèi),接著再新開一個(gè)隱身窗口登錄這個(gè)新創(chuàng)建的管理員賬戶,我們可以看到和預(yù)期的結(jié)果一樣,管理員可以看到全部用戶創(chuàng)建的待辦事項(xiàng)記錄,隨便點(diǎn)擊一條記錄并編輯,修改任意內(nèi)容后保存,這時(shí)候你會(huì)發(fā)現(xiàn)彈出了一個(gè)錯(cuò)誤警告
這個(gè)錯(cuò)誤提示我們當(dāng)前用戶沒有權(quán)限修改這一條記錄,就如我們前面的假設(shè)一樣,管理員不能修改其他用戶創(chuàng)建的記錄,剩下的創(chuàng)建和刪除,大家可以隨意測試。
看完了效果之后,又到了解釋說明的時(shí)間了,我們先來看到定義的規(guī)則里最后四個(gè)屬性字段,是不是很熟悉呢?沒錯(cuò),這就是我們在定義用戶組權(quán)限時(shí)所看到的表示讀寫創(chuàng)建和刪除這四個(gè)操作的屬性,在記錄集權(quán)限的定義里,他們的含義是一樣的,只不過屬性值從 0 和 1 變成了 True 和 False,然后我們再來看看另外幾個(gè)字段:
model_id:要應(yīng)用該規(guī)則的模型的外部 ID
domain_force:過濾條件,符合該條件的記錄都將按照所定義權(quán)限進(jìn)行檢查,其中變量 user 表示當(dāng)前用戶的實(shí)例對象,可以直接使用
groups:應(yīng)用該規(guī)則的用戶組,如果不指定則默認(rèn)對全部用戶應(yīng)用該規(guī)則
菜單隱藏目前為止,一切看起來都很不錯(cuò),不過還有點(diǎn)美中不足。我們再次打開測試賬戶所在的瀏覽器窗口,我們前面留了一個(gè)小作業(yè),分類只允許管理員進(jìn)行管理,那么我們自然不希望普通用戶看到多余的菜單內(nèi)容了,所以某些時(shí)候用戶雖然對某些數(shù)據(jù)具有可讀的權(quán)限,但是未必會(huì)想要開放對應(yīng)的菜單入口給這些用戶。而我們要根據(jù)用戶組來對菜單的可見性進(jìn)行處理,其實(shí)也很簡單,只需要在對應(yīng)的菜單項(xiàng)上添加一個(gè) groups 屬性即可,里面的值可以是逗號(hào)分隔的多個(gè)用戶組的外部 ID,以「分類」菜單為例
就這么簡單,更新模塊之后刷新瀏覽器看看,「分類」菜單是不是已經(jīng)被隱藏起來了呢,而管理員賬戶依然可以看到該菜單。除了菜單外,在視圖的字段上也可以通過添加屬性 groups 達(dá)到針對不同的用戶組隱藏相關(guān)字段的目的。
以上就是這篇教程的全部內(nèi)容了,老規(guī)矩,代碼都在 GitHub 倉庫「Odoo-Tutorial-Demo」中。
寫在最后雖說這是「Odoo 基礎(chǔ)教程系列」的最后一篇內(nèi)容了,但是這不意味著之后不會(huì)再寫 Odoo 相關(guān)的內(nèi)容了,感謝大家一直以來的支持,雖然很小眾,但是也有不少小伙伴給予了一些正面的鼓勵(lì),雖然更新速度很慢很慢,但是這個(gè)系列終于還是完成啦!自我感覺還是有很多寫得不好的地方,希望以后可以寫得更好~
如果大家有什么問題想要得到解答,可以加入群里,和其他小伙伴一起交流或者提問,添加下面這個(gè)微信,備注 Odoo 加群,通過后將會(huì)拉入群里的 :)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/44969.html
摘要:雖然這是個(gè)很簡單的應(yīng)用,但是希望大家可以動(dòng)手一起操作,從最簡單的開始上手學(xué)習(xí)如何使用這個(gè)框架。則是在和之間,負(fù)責(zé)響應(yīng)用戶操作,從中獲取數(shù)據(jù)進(jìn)行處理并返回到中。 showImg(https://segmentfault.com/img/bV66tE?w=728&h=410); 在第一篇教程發(fā)布之后差不多一個(gè)月的今天,終于完成了第二篇內(nèi)容,這個(gè)發(fā)布周期拖得實(shí)在是有點(diǎn)太長了,我都覺得不好意思...
摘要:現(xiàn)在我們來給待辦事項(xiàng)增加一個(gè)緊急程度的字段,用來表示當(dāng)前任務(wù)的優(yōu)先級(jí)。此處我們還給這個(gè)字段添加了默認(rèn)值,表示當(dāng)一個(gè)待辦事項(xiàng)被創(chuàng)建后,如果沒有指定緊急程度,將默認(rèn)是待辦狀態(tài)。這篇教程中的代碼同樣會(huì)更新在我的倉庫中。 showImg(https://segmentfault.com/img/bVbfv3E?w=1330&h=912); 在這篇教程里我們將會(huì)了解到 Odoo 模型里的一些其他...
摘要:在這一篇教程中,將會(huì)涉及到外鍵字段,可以將兩個(gè)模型關(guān)聯(lián)起來,然后很方便地獲取到對應(yīng)的數(shù)據(jù)。關(guān)聯(lián)字段這一小節(jié)里,我們會(huì)給待辦事項(xiàng)加上分類,并且這個(gè)分類可以讓用戶自己創(chuàng)建維護(hù)。今天這篇教程的內(nèi)容就先到這里了,教程中的代碼會(huì)更新在我的倉庫中。 showImg(https://segmentfault.com/img/bVbfzvt?w=1280&h=795); 在這一篇教程中,將會(huì)涉及到外鍵...
摘要:大家好鴨,我又來更新啦還記得我們在第二篇教程中提到過的動(dòng)作嗎,今天我們就來專門講講在中的,學(xué)習(xí)不同類型的動(dòng)作對應(yīng)的應(yīng)用場景,并且在我們的應(yīng)用中使用上其中一些類型的動(dòng)作。報(bào)表動(dòng)作這類型的動(dòng)作用于觸發(fā)報(bào)表打印,例如打印發(fā)票等。 showImg(https://segmentfault.com/img/bVbhdTE?w=1471&h=845); 大家好鴨,我又來更新啦!還記得我們在第二篇教...
摘要:在前面教程中,我們使用了兩種類型的視圖和今天我們將學(xué)習(xí)使用另一種類型的視圖搜索視圖。大家可以試試看同時(shí)應(yīng)用多個(gè)分組,或者將分組和過濾器組合使用,仔細(xì)觀察和思考產(chǎn)生的結(jié)果。還是老規(guī)矩,教程中的代碼會(huì)更新在倉庫中。 showImg(https://segmentfault.com/img/bVbgO85?w=1950&h=1300); 在前面教程中,我們使用了兩種類型的視圖——TreeVi...
閱讀 1274·2023-04-26 01:38
閱讀 1472·2021-11-15 11:39
閱讀 3263·2021-09-22 15:43
閱讀 2657·2019-08-30 15:55
閱讀 2059·2019-08-30 14:17
閱讀 2861·2019-08-29 14:16
閱讀 3071·2019-08-26 18:36
閱讀 2616·2019-08-26 12:19