2020-12-27 odoo權(quán)限管理原理之一

開(kāi)源軟件最詳細(xì)的手冊(cè)就是源代碼,但源代碼錯(cuò)綜復(fù)雜,并不是最好的手冊(cè)。關(guān)于odoo的權(quán)限管理,網(wǎng)上能找到的文章千篇一律,都不能把底層的實(shí)現(xiàn)原理講清楚,只講了四個(gè)級(jí)別的權(quán)限控制方法。我不滿(mǎn)足于應(yīng)用,對(duì)底層的實(shí)現(xiàn)原理也想搞清楚。研究了兩天,終于梳理出了一些眉目,記錄下來(lái),并設(shè)計(jì)了一個(gè)案例,基本涵蓋了權(quán)限控制的所有方面。經(jīng)過(guò)深入研究,發(fā)現(xiàn)odoo的權(quán)限控制并不完美,有些需求仍需要重寫(xiě)底層代碼才能實(shí)現(xiàn),這也將在后面的案例中展示。
odoo權(quán)限管理原理系列將分三次介紹。今天介紹最基本的組類(lèi)、組和用戶(hù)的關(guān)系。后面將再寫(xiě)兩個(gè)專(zhuān)題,依次介紹權(quán)限組如何控制菜單、視圖、動(dòng)作、模型、記錄和字段,以及一個(gè)地產(chǎn)公司管理軟件的權(quán)限設(shè)置案例。

1. 組類(lèi)、組和用戶(hù)

odoo權(quán)限控制的核心是用戶(hù)組,菜單級(jí)、動(dòng)作級(jí)、視圖級(jí)、表級(jí)、記錄級(jí)和字段級(jí)的權(quán)限控制都是圍繞用戶(hù)組展開(kāi)。下圖給出了與用戶(hù)組密切相關(guān)的base模塊中的4個(gè)基礎(chǔ)模型ER關(guān)聯(lián)圖。


組類(lèi)、組和用戶(hù).png

res_groups表中記錄了odoo中定義的所有組,這些組使用外鍵category_id關(guān)聯(lián)到ir_module_category表,實(shí)現(xiàn)組的分類(lèi)管理,且這種分類(lèi)可以形成樹(shù)形結(jié)構(gòu)。舉個(gè)實(shí)際中的例子:有幾個(gè)應(yīng)用屬于同一個(gè)公司開(kāi)發(fā)的套件,這每一個(gè)應(yīng)用都需要定義若干個(gè)權(quán)限組,而這些應(yīng)用又可以進(jìn)一步歸屬于這個(gè)開(kāi)發(fā)公司。實(shí)現(xiàn)的效果如下所示,這是管理員打開(kāi)的用戶(hù)設(shè)置的界面,其中My Apps是我定義的一個(gè)根組類(lèi),其下還有兩個(gè)子組類(lèi)Fund和Estate。真正的權(quán)限組在Fund和Estate組類(lèi)后的下拉列表里。


組類(lèi)和組.png

對(duì)應(yīng)的數(shù)據(jù)文件如下。數(shù)據(jù)文件可以以“security_模塊名.xml”命名,放置在模塊security目錄下,并在__manifest__.py文件的data字段注冊(cè)。
        <!-- 定義組類(lèi) -->
        <!-- 定義根組類(lèi)My Apps -->
        <record model="ir.module.category" id="module_category_myapps">
            <field name="name">My Apps</field>
        </record>
        <!-- 定義子組類(lèi)Estate和Fund,它們的parent_id字段通過(guò)XML ID指向My Apps -->
        <record model="ir.module.category" id="module_category_estate">
            <field name="name">Estate</field>
            <field name="parent_id" ref="module_category_myapps"/>
        </record>
        <record model="ir.module.category" id="module_category_fund">
            <field name="name">Fund</field>
            <field name="parent_id" ref="module_category_myapps"/>
        </record>

        <!-- 定義組,它們的category_id字段通過(guò)XML ID指向各自的組類(lèi) -->
        <!-- 為Estate應(yīng)用定義兩個(gè)權(quán)限組:Saler和Manager -->
        <record model='res.groups' id='group_saler'>
            <field name="name">Saler</field>
            <field name="category_id" ref="module_category_estate"/>
            <field name="implied_ids" eval="[(6,0,[ref('base.group_user')])]"/>
        </record>
        <record model='res.groups' id="group_manager">
            <field name="name">Manager</field>
            <field name="category_id" ref="module_category_estate"/>
            <field name="implied_ids" eval="[(6,0,[ref('base.group_user'),ref('group_saler')])]"/>
        </record>
        <!-- 為Fund應(yīng)用定義兩個(gè)權(quán)限組:Saler和Manager -->
        <record model='res.groups' id='group_fund_saler'>
            <field name="name">Saler</field>
            <field name="category_id" ref="module_category_fund"/>
            <field name="implied_ids" eval="[(6,0,[ref('base.group_user')])]"/>
        </record>
        <record model='res.groups' id="group_fund_manager">
            <field name="name">Manager</field>
            <field name="category_id" ref="module_category_fund"/>
            <field name="implied_ids" eval="[(6,0,[ref('base.group_user'),ref('group_fund_saler')])]"/>
        </record>

res_users表中保存了系統(tǒng)的所有用戶(hù),可以由管理員登錄用戶(hù)管理界面,為用戶(hù)分配權(quán)限組。也可以通過(guò)數(shù)據(jù)文件向系統(tǒng)中導(dǎo)入用戶(hù)和權(quán)限組,在導(dǎo)入用戶(hù)和權(quán)限組的過(guò)程中就可以建立用戶(hù)與權(quán)限組的關(guān)聯(lián)關(guān)系。在base模塊的res_users.py文件中,定義了res.users模型和res.groups模型,res.users模型中有一個(gè)groups_id字段對(duì)應(yīng)了res.groups模型的users字段,它們都是many2many類(lèi)型,在導(dǎo)入用戶(hù)或者導(dǎo)入權(quán)限組時(shí),可以通過(guò)eval="[(6,0,[ref('XML ID'),...])]"的方式建立用戶(hù)和權(quán)限組的關(guān)聯(lián),它們的關(guān)聯(lián)關(guān)系記錄在res_groups_users_rel這張中間表中。
今天太晚了,明天接著梳理通過(guò)權(quán)限組控制菜單、視圖、動(dòng)作、模型、記錄、字段。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容