在Odoo中,使用用戶組(res.groups)來管理權限,一個特殊的用戶組是 員工/員工(base.group_user) 組,全部的用戶都屬於這個組,這個組裏包含一些基本的權限。
四種權限級別(粒度愈來愈細):
1.菜單/對象級別
設置哪些人能夠訪問哪些菜單/對象,對象的訪問權限包括建立、讀、寫、刪除。
2.記錄級別
設置哪些人能夠訪問哪些記錄,也就是設置表的查詢條件。
3.字段級別
設置表中的字段的訪問權限。
4.工做流級別(不多用到)
在工做流的每一步遷移中,設置哪些角色容許觸發本遷移web
下面示例使用的是account模塊中的代碼,因此你們有什麼問題能夠去odoo源碼查詢。
關於權限的文件通常在security文件夾中,
xxx_security.xml文件定義用戶組和用戶組對菜單的訪問權限
ir.model.access.csv定義用戶組對對象的權限矩陣segmentfault
首先建立一個組分類(表示不少組屬於一個分類):dom
<record id="base.module_category_accounting_and_finance" model="ir.module.category"> <field name="name">module_category_accounting_and_finance</field> <field name="sequence">57</field> </record>
再建立一個用戶組:ui
<record id="group_account_invoice" model="res.groups"> <!-- 組的名字,如:員工 --> <field name="name">Billing</field> <!-- 此組屬於的組分類 --> <field name="category_id" ref="base.module_category_accounting_and_finance"/> <!-- 繼承的組,也就是說這個組也擁有這些繼承組的權限 --> <field name="implied_ids" eval="[(4, ref('base.group_user'))]"/> </record>
修改這個組的一些內容,如:給這組加上一個用戶:code
<record id="group_account_invoice" model="res.groups"> <!-- 給這個組添加admin用戶 --> <field name="users" eval="[(4, ref('base.user_root'))]"/> </record>
下面說一下eval語法:xml
(0, 0, {values}) 根據values的值新建一條記錄 (1, ID, {values}) 更新id=ID的記錄,(寫入values的值) (2, ID) 刪除id=ID這條記錄,(調用unlink方法,刪除數據及整個主從數據連接關係) (3, ID) 切斷主從數據的連接關係可是不刪除這個記錄 (4, ID) 爲id=ID的數據添加主從連接關係 (5) 刪除全部的從數據的連接關係,也就是向全部的從數據調用(3, ID) (6, 0, [IDs]}) 用IDs中的記錄替換原來的記錄(至關於先執行(5)在循環執行(4, ID))
模塊下 security 目錄下的文件:ir.model.access.csv對象
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_product_product_account_user,product.product.account.user,product.model_product_product,group_account_user,1,0,0,0 access_product_product_account_manager,product.product.account.manager,product.model_product_product,group_account_manager,1,1,1,1 access_product_template_account_manager,product.template.account.manager,product.model_product_template,group_account_manager,1,1,1,1 access_product_price_history_account_manager,prices.history.account.manager,product.model_product_price_history,group_account_manager,1,1,1,1 access_account_payment_term,account.payment.term,model_account_payment_term,account.group_account_`user,1,0,0,0
id:能夠隨便取,可是在一個模塊中是惟一的,通常取名爲 access_模型名_特定用戶組名(用下劃線連起來)
name: 能夠隨便取,通常命名沿用模型名用「.」鏈接加 用戶組名
model:id: 要作權限控制的model,格式寫法是 模塊名.model_模塊名(中間的‘.’換成‘_’),若是model在此模塊中,能夠省略模塊名,如product.model_product_product
group:id:組的id,不是本模塊的組,要在前面加上模塊名,如:account.group_account_user
perm_read,perm_write,perm_create,perm_unlink:這些就是具體的權限:讀寫增刪,1 有權限,0 無權限繼承
<record id="menu_finance" model="ir.ui.menu"> <field name="name">Invoicing</field> <field name="web_icon">account,static/description/icon.png</field> <field name="sequence">40</field> <field name="groups_id" eval="[(6, 0, [ref('account.group_account_user'), ref('account.group_account_manager'), ref('account.group_account_invoice')])]"/> </record>
<menuitem name="Invoicing" id="menu_finance" groups="group_account_user,group_account_manager,group_account_invoice" web_icon="account,static/description/icon.png" sequence="40"/>
上面的2個xml表示menu_finance這個菜單隻能被group_account_user,group_account_manager,group_account_invoice 三個用戶組訪問
若是有上級菜單,加parent屬性,若是上級菜單不在本模塊中,須要加模塊名如:account.menu_finance:ip
<menuitem id="menu_finance_reports" name="Reports" parent="menu_finance" sequence="5" groups="group_account_invoice"/>
記錄的權限放在"ir.rule"model中,全部咱們添加或修改ir_rule表中的記錄,就能夠控制記錄的權限ci
<record id="account_move_comp_rule" model="ir.rule"> <!-- 規則名稱 --> <field name="name">Account Entry</field> <!-- 對應模型 --> <field name="model_id" ref="model_account_move"/> <!-- 是否全局 --> <field name="global" eval="True"/> <!-- 過濾條件 其中user表示當前登陸用戶對象 --> <field name="domain_force">['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]</field> <!-- 讀寫增刪權限(針對過濾後的記錄) --> <field name="perm_read" eval="True"/> <field name="perm_write" eval="False"/> <field name="perm_create" eval="False"/> <field name="perm_unlink" eval="False"/> </record>
domain_force(也就是domain表達式的寫法)寫法請看個人另外一篇博客domain的寫法及運用。
給字段上添加用戶組,表示只有這些組的用戶在這個視圖中才能訪問和操做這個字段,如:
<record id="view_invoice_line_tree" model="ir.ui.view"> <field name="name">account.invoice.line.tree</field> <field name="model">account.invoice.line</field> <field name="arch" type="xml"> <tree string="Invoice Line"> <field name="name"/> <field name="account_id" groups="account.group_account_user"/> <field name="quantity"/> <field name="uom_id" groups="product.group_uom,account.group_account_user"/> <field name="price_unit"/> <field name="discount" groups="base.group_no_one"/> <field name="price_subtotal"/> <field name="currency_id" invisible="1"/> </tree> </field> </record>
上面xml表示在這個tree視圖(這裏注意,這個權限只針對這個tree視圖)上,account_id,uom_id,discount這3個字段只有對應的用戶組中的用戶才能看到。
若是你想在這個model的全部視圖中都有這個權限控制的話,要在這個字段定義的時候,就要指定groups,多個用戶組用","分隔,如:
gengo_private_key = fields.Text(string="Gengo Private Key", copy=False, groups="base.group_system,base.group_user")
權限控制到這裏就結束了,若是有什麼錯誤的地方,歡迎你們指出。