1. 程式人生 > >odoo 許可權那點事。。。

odoo 許可權那點事。。。

*許可權管理的四個層次

# 選單級別:不屬於指定選單所包含組的使用者看不到該選單,不客全,只是隱藏

選單,若知道選單ID,仍然可以通過指定URL訪問

# 物件級別:對某個對角是否有'建立,讀取,修改,刪除'的許可權,可以簡單理解為

表物件

# 記錄級別:對物件表中的資料的訪問許可權,比如訪問“客戶”物件,業務員只能對自己建立

的客戶有訪問許可權,而經理可以訪問其管轄的業務員所有的“客戶”物件

# 欄位級別:一個物件或表上的某些欄位的訪問許可權,比如產品的成本欄位只有經理有讀許可權

'name':fields.char('Name',size=128,required=True,select=True,write=['base.group_admin']

read=['base.group_admin'])

定義name欄位只能超級使用者組可讀寫

* 建立許可權組

這是我們常說的使用者組,會通常放在“模組名_security.xml”這個檔案中

例如:

Manager

the user will have an access to the human resources configuration as well as statistic reports.

@name:使用者組名,這個或以翻譯的

@comment:使用者組的註釋

@category_id 使用者組所屬的模組名

@implied_ids 基於哪個使用者組,這個層級關係 是最基礎的

使用者名稱,最初是基於這個,後面一層一層遞增,像上面 base.group_hr_user 定義時就是基於最基礎

@users 預設使用者屬於這個使用者組

* 許可權組

許可權管理核心是許可權組,每個許可權組,可以設定許可權組的 Menus,Access Right, Record Rule

# Menus:

定義該許可權組可以訪問哪些選單,若該許可權組可以訪問某父選單,父選單對應的子選單會顯示出來

若不想顯示其子選單,可以把其子選單加入 "Useablity/No One" 許可權組。

# Access Right:

定義該許可權組可以訪問哪些物件,以及擁有 增、查、改、刪的哪個許可權    (create,read,write,unlink)

# Record Rule:

定義該許可權組可以訪問物件中的哪些記錄,以及擁有 增、查、改、刪的哪個許可權    ,Access Right是

對物件中的所有記錄賦許可權,Record Rule 則通過定義domain過濾指定某些記錄賦許可權

['&',('department','=',user.context_department_id.id),('state','=','pr_draft')]

申購單的部門等於當前使用者的部門,且申購單的狀態是草稿狀態

* 基於組的訪問控制

# 檢視中

運用group_id

sale.order.form.editable.list

sale.order

ref('product.group_stock_packaging'),

ref('sale.group_mrp_properties')])]" />

eval:把eval的值通過作為python運算返回該屬性

ref:檢視的方法,根據 module_name.xml_id 返回資料庫id

[(6,0,[xx,yy])]

(0,_ ,{’field’: value}) 這將建立一個新的記錄並連線它

(1,id,{’field’: value}): 這是更新一個已經連線了的記錄的值

(2,id,_) 這是刪除或取消連線某個已經連線了的記錄

(3,id,_) 這是取消連線但不刪除一個已經連線了的記錄

(4,id,_) 連線一個已經存在的記錄

(5,_,_) 取消連線但不刪除所有已經連線了的記錄

(6,_,[ids]) 用給出的列表替換掉已經連線了的記錄

這裡的下劃線一般是0或False

運用groups

attrs="{'invisible': ['|', ('state','!=','open'), ('sent','=',True)]}" groups="base.group_user"/>

#在模型中

package_id = fields.Many2one(

comodel_name='stock.quant.package', string='Package',

related='quant.package_id', readonly=True,

groups="stock.group_tracking_lot")

要有多個使用者組時,使用者組之間用逗號隔開

#小結

只有在檢視中有完整標籤時,會用group_id,其它都用groups

*訪問許可權管理:

對於其內的資料訪問許可權管理有兩種機制:

第一種是模型訪問許可權管理 (accessrule);

第二種是記錄規則管理 (record rule)。

record rule 是對accessrule的細化 ,帶條件,比如記錄是什麼狀態的可以訪問

如果不為模組設定規則,預設只有Administator才能訪問這個模型的資料

record rule 對 Administator 使用者是無效的,而access rule還是有效

# access rule

許可權物件模型是 ir.model.access.csv

一般是放在security 資料夾下的 ir.model.access.csv 檔案來管理的

檔案表頭如下:

id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink

來一個例子:

id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink

access_payment_notice_account_user,payment.notice.account.user,model_payment_notice,account.group_account_user,1,1,1,1

access_payment_notice_sale_user,payment.notice.sale.user,model_payment_notice,base.group_sale_salesman,1,1,0,0

分析這個是針對 payment.notice 這個模型做訪問許可權設定

可以看一下對應模型定義的程式碼:

class PaymentNotice(models.Model):

_name = "payment.notice"

id:許可權的ID不可重複 一般取名為 access_模型名_特定使用者組名(用下劃線連起來)

name 描述 一般命名沿用模型名用“.”連線加 使用者組名

model_id:id:物件,命名是model_模型名(用下劃線連起來)

group_id:id  組名稱 (模組.使用者組名)

下面的,0 表示無許可權, 1 表示有許可權

perm_read  只讀

perm_write 修改

perm_create 建立

perm_unlink 刪除

# record rule

一般是放在security 資料夾下的 模組名_record_rules.xml 檔案來管理的

對於模型許可權的補充

Personal Payment Notice

['|',('claimed_user_id','=',user.id),('claimed_user_id','=',False)]

All Payment Notice

[(1,'=',1)]

record rule    記錄是 ir.rule 模型, 存在public.ir_rule 表格中

model_id 作用於哪個模型 值為 model_模型名

domain_force 對該模型中所有記錄進行某種過濾操作

常用的 ['|',('user_id','=',user.id),('user_id','=',False)] 表示是自己的單

user_id是記錄的欄位,這個看實際情況改變, user.id 代表當前登入使用者的id

[(1,'=',1)] 表示所有的單

noupdate 值為1 表示升級模組不會更新本資料

base.group_user 是人力資源 / 僱員

perm_read 這些後面,是對 前面模型許可權組設定的覆蓋

* 來一個完整的例子解說:

# 建立組

A

//把admin使用者加入該組中

@ name 組名稱

@ category_id 屬於哪個應用程式,或者哪個模組,為了方便管理

@ users 組裡面的使用者

這樣B應用程式就建立了一個名叫A的組。並且初始化了A組的一個使用者admin

# 組控制選單顯示

A

menu1

1

@ name 選單名稱

@ groups_id 哪些組可以訪問該選單

@ sequence 該選單的序號

這樣A組與B組的成員都可以訪問menu1選單,menu1選單的顯示順序為1

注:eval 後面解釋,多個組訪問用“,”隔開

@ name 選單名稱

@ parent 父類選單 如果沒有可以不寫parent

@ groups哪些組可以訪問該選單

這樣menu1的子選單menu2可以被A組合B組的成員訪問

# 許可權規則

rule1

[1,’=’,1]

@ name 規則名稱

@ model_id 依賴的模組

@ global 是否是全域性

@ domain_force 過濾條件

@ groups 屬於哪個組

這樣A組的成員就可以取到model_model1的所有資料

# ir.model.access.csv

@id 隨便取

@name 隨便取

@model_id:id 這個就是你所定義的物件了

@group_id:哪個組

@perm_read","perm_write","perm_create","perm_unlink" 增刪改查許可權了。1代表有許可權

# Eval

many2many

(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)再執行迴圈IDs執行(4,ID))

例子[(6, 0, [8, 5, 6, 4])] 設定 many2many to ids [8, 5, 6, 4]

one2many

(0, 0,{ values })根據values裡面的資訊新建一個記錄。

(1,ID,{values}) 更新id=ID的記錄(對id=ID的執行write 寫入values裡面的資料)

(2,ID) 刪除id=ID的資料(呼叫unlink方法,刪除資料以及整個主從資料鏈接關係)

例子:

[(0,0,{'field_name':field_value_record1,...}),(0,0,{'field_name':field_value_record})]

many2one的欄位比較簡單,直接填入已經存在的資料的id或者填入False刪除原來的記錄。

# 隱藏的常用技巧

* 直接隱藏

True

* 滿足某些條件的隱藏

{'invisible': [('passenger','=', True)]}

* 通過組來隱藏

base.group_no_one

* 選單的隱藏

* 程式碼分析中的運用

#欄位顯示許可權

#在model中判斷

self.pool.get('res.users').has_group(cr, uid, 'sale.group_discount_per_so_line')

共勉!