odoo V10中文參考手冊(cè)(六:安全烙博、測(cè)試用例瑟蜈、web控制器)

安全

odoo提供了兩種方式來(lái)管理數(shù)據(jù)權(quán)限而不需要通過(guò)手寫(xiě)權(quán)限管理相關(guān)代碼,每種方式都通過(guò)用戶組來(lái)指定用戶:一個(gè)用戶屬于多個(gè)用戶組渣窜,安全機(jī)制通過(guò)用戶組關(guān)聯(lián)作用到用戶

訪問(wèn)控制

1.通過(guò)ir.model.access記錄來(lái)管理铺根,定義對(duì)整個(gè)模型的訪問(wèn)權(quán)限
2.每一條記錄包含有 (1)對(duì)應(yīng)的授權(quán)模型 (2)授予的權(quán)限 (3) 可選的用戶組
3.訪問(wèn)權(quán)限控制是附加的,對(duì)于一個(gè)模型用戶擁有賦予它所在組的權(quán)限:如果用戶所在用戶組1擁有寫(xiě)權(quán)限乔宿,用戶組2有刪除權(quán)限位迂,那么該用戶擁有寫(xiě)和刪除權(quán)限)
4.如果沒(méi)有指定用戶組,這條權(quán)限控制就會(huì)作用在所有用戶上详瑞,否則只會(huì)作用在指定組的用戶上
5.可用的權(quán)限是:寫(xiě)(perm_create),搜索和讀取(perm_read),更新現(xiàn)有記錄(perm_write),刪除記錄(perm_unlink)

記錄行規(guī)則

記錄行規(guī)則規(guī)定進(jìn)行(create, read, update or delete)操作時(shí)數(shù)據(jù)需要滿足的條件掂林,它會(huì)在應(yīng)用了訪問(wèn)控制權(quán)限之后逐條記錄進(jìn)行應(yīng)用

記錄行規(guī)則的要素:
1.需要被應(yīng)用規(guī)則的model
2.需要應(yīng)用的規(guī)則(如果設(shè)置了perm_read ,那么只在讀取記錄時(shí)檢查)
3.需要應(yīng)用規(guī)則的用戶組坝橡,如果沒(méi)指定用戶組泻帮,那么該規(guī)則就是全局的
4.用來(lái)檢查記錄是否滿足條件的domain表達(dá)式,如果true表示可訪問(wèn)驳庭,false表示不可訪問(wèn)刑顺,domain表達(dá)式使用兩個(gè)上下文變量:user - 當(dāng)前用戶記錄氯窍,time - python time

全局規(guī)則和基于用戶組的規(guī)則使用方式不同:

  • 全局規(guī)則必須全部滿足才能賦予權(quán)限
  • 用戶組規(guī)則是附加的饲常,只要滿足其中一個(gè)就可以有權(quán)限(需要滿足全局權(quán)限)

記錄行規(guī)則對(duì)于管理員用戶是沒(méi)有作用的

字段權(quán)限

一個(gè)ORM字段可以通過(guò)groups屬性來(lái)指定一個(gè)可訪問(wèn)的組列表(以逗號(hào)分隔)

如果當(dāng)前用戶不在指定的任何一個(gè)用戶組中蹲堂,那么不能訪問(wèn)該字段

  • 沒(méi)訪問(wèn)權(quán)限的字段會(huì)自動(dòng)從視圖中移除
  • 沒(méi)權(quán)限的字段也會(huì)從fields_get() 函數(shù)的返回中移除
  • 嘗試去讀或?qū)懳词跈?quán)字段會(huì)報(bào)出一個(gè)權(quán)限錯(cuò)誤

工作流轉(zhuǎn)換規(guī)則

工作流也可以通過(guò)指定用戶組來(lái)控制權(quán)限,用戶不在指定組內(nèi)的將不會(huì)觸發(fā)相應(yīng)動(dòng)作

模塊測(cè)試

odoo支持通過(guò)單元測(cè)試來(lái)測(cè)試模塊贝淤,寫(xiě)測(cè)試用例只需要在模塊文件夾建立一個(gè)test文件夾柒竞,測(cè)試模塊文件名須以test_開(kāi)頭,并且在__ init __.py里導(dǎo)入

your_module
|-- ...
`-- tests
    |-- __init__.py
    |-- test_bar.py
    `-- test_foo.py
#__init__.py
from . import test_foo, test_bar

默認(rèn)只能運(yùn)行python官方提供的部分測(cè)試播聪,odoo提供了一些用來(lái)測(cè)試odoo內(nèi)容的工具

  • class odoo.tests.common.TransactionCase(methodName='runTest')
    每個(gè)測(cè)試方法運(yùn)行在自己的事務(wù)中的測(cè)試用例朽基,使用自己的數(shù)據(jù)庫(kù)游標(biāo),當(dāng)用例執(zhí)行完自動(dòng)回滾

  • browse_ref(xid) 返回指定id的記錄對(duì)象

  • ref(xid) 返回提供的external identifier對(duì)應(yīng)的數(shù)據(jù)庫(kù)id离陶,與get_object_reference一致

  • class odoo.tests.common.SingleTransactionCase(methodName='runTest')
    所有測(cè)試方法都在同一個(gè)事務(wù)中執(zhí)行的測(cè)試用例稼虎,事務(wù)從第一個(gè)測(cè)試方法開(kāi)始,直到最后一個(gè)完成才回滾

  • browse_ref(xid) 返回指定id的記錄對(duì)象

  • ref(xid) 返回提供的external identifier對(duì)應(yīng)的數(shù)據(jù)庫(kù)id招刨,與get_object_reference一致

默認(rèn)情況下霎俩,在安裝好對(duì)應(yīng)模塊后會(huì)自動(dòng)執(zhí)行對(duì)應(yīng)的測(cè)試用例,也可配置為在所有模塊安裝完成后再運(yùn)行

  • odoo.tests.common.at_install(flag)
    設(shè)置安裝測(cè)試用例沉眶,flag參數(shù)(boolean)設(shè)置該測(cè)試用例是否在安裝時(shí)執(zhí)行打却,默認(rèn)情況下會(huì)在安裝完該模塊后,安裝下一個(gè)模塊前自動(dòng)運(yùn)行用例

  • odoo.tests.common.post_install(flag)
    設(shè)置安裝后測(cè)試用例谎倔,flag參數(shù)(boolean)表示是否在安裝后自動(dòng)運(yùn)行用例柳击,默認(rèn)情況下測(cè)試用例只會(huì)在所有模塊安裝完成后才運(yùn)行

class TestModelA(common.TransactionCase):
    def test_some_action(self):
        record = self.env['model.a'].create({'field': 'value'})
        record.some_action()
        self.assertEqual(
            record.field,
            expected_field_value)

    # other tests...

當(dāng)啟動(dòng)odoo時(shí)如果指定--test-enable ,測(cè)試用例會(huì)在安裝或更新模塊時(shí)運(yùn)行

web控制器

路由

odoo.http.route(route=None, **kw) 裝飾器可以裝對(duì)應(yīng)方法裝飾為處理對(duì)應(yīng)的http請(qǐng)求片习,該方法須是Controller的子類

參數(shù)列表:

  • route -- 字符串或數(shù)組捌肴,決定哪個(gè)http請(qǐng)求匹配所裝飾的方法,可以是當(dāng)個(gè)字符串藕咏、或多個(gè)字符串的數(shù)組状知,用的是werkzeug的路由http://werkzeug.pocoo.org/docs/routing/
  • type -- 請(qǐng)求的類型,可以是http或json
  • auth -- 認(rèn)證方法的類型侈离,可以是以下幾種:
    • user - 必須是認(rèn)證的用戶试幽,該請(qǐng)求基于已認(rèn)證的用戶
    • public - 當(dāng)不通過(guò)認(rèn)證訪問(wèn)時(shí)使用公用的認(rèn)證
    • none - 相應(yīng)的方法總是可用,一般用于框架和認(rèn)證模塊卦碾,對(duì)應(yīng)請(qǐng)求沒(méi)有辦法訪問(wèn)數(shù)據(jù)庫(kù)或指向數(shù)據(jù)庫(kù)的設(shè)置
  • methods 這個(gè)請(qǐng)求所應(yīng)用的一系列http方法铺坞,如果沒(méi)指定則是所有方法
  • cors 跨域資源cors參數(shù)
  • csrf(boolean) 是否開(kāi)啟CSRF保護(hù),默認(rèn)True

1.如果表單是用python代碼生成的洲胖,可通過(guò)request.csrf_token() 獲取csrf
2.如果表單是用javascript生成的济榨,CSRF token會(huì)自動(dòng)被添加到QWEB環(huán)境變量中,通過(guò)require('web.core').csrf_token使用
3.如果終端可從其他地方以api或webhook形式調(diào)用绿映,需要將對(duì)應(yīng)的csrf禁用擒滑,此時(shí)最好用其他方式進(jìn)行驗(yàn)證

請(qǐng)求

請(qǐng)求對(duì)象在收到請(qǐng)求時(shí)自動(dòng)設(shè)置到odoo.http.request

class odoo.http.WebRequest(httprequest)

所有odoo WEB請(qǐng)求的父類腐晾,一般用于進(jìn)行請(qǐng)求對(duì)象的初始化

  • httprequest 原始的werkzeug.wrappers.Request對(duì)象
  • params 請(qǐng)求參數(shù)的映射
  • cr 當(dāng)前方法調(diào)用的初始游標(biāo),當(dāng)使用none的認(rèn)證方式時(shí)讀取游標(biāo)會(huì)報(bào)錯(cuò)
  • context 當(dāng)前請(qǐng)求的上下文鍵值映射
  • env 綁定到當(dāng)前請(qǐng)求的環(huán)境
  • session 儲(chǔ)存當(dāng)前請(qǐng)求session數(shù)據(jù)的OpenERPSession
  • debug 指定當(dāng)前請(qǐng)求是否是debug模式
  • db 當(dāng)前請(qǐng)求所關(guān)聯(lián)的數(shù)據(jù)庫(kù)丐一,當(dāng)使用none認(rèn)證時(shí)為None
  • csrf_token(time_limit=3600) 為該請(qǐng)求生成并返回一個(gè)token(參數(shù)以秒計(jì)算藻糖,默認(rèn)1小時(shí),如果傳None表示與當(dāng)前用戶session時(shí)間相同)

class odoo.http.HttpRequest(*args)

用于處理http類型請(qǐng)求的函數(shù)库车,匹配路由參數(shù)巨柒、查詢參數(shù)、表格參數(shù)柠衍,如果有指定文件也會(huì)傳給該方法洋满。為防止重名,路由參數(shù)優(yōu)先級(jí)最高珍坊。
該函數(shù)的返回有三種:

  • 無(wú)效值牺勾,HTTP響應(yīng)會(huì)返回一個(gè)204(沒(méi)有內(nèi)容)
  • 一個(gè)werkzeug 響應(yīng)對(duì)象
  • 一個(gè)字符串或unicode,會(huì)被響應(yīng)對(duì)象包裝并使用HTML解析

make_response(data, headers=None, cookies=None)

用于生成沒(méi)有HTML的響應(yīng) 或 自定義響應(yīng)頭阵漏、cookie的html響應(yīng)
由于處理函數(shù)只以字符串形式返回html標(biāo)記內(nèi)容驻民,需要組成一個(gè)完整的響應(yīng)對(duì)象,這樣客戶端才能解析

參數(shù):

  1. data (basestring) -- 響應(yīng)主體
  2. headers ([(name, value)]) -- http響應(yīng)頭
  3. cookies (collections.Mapping) -- 發(fā)送給客戶端的cookie

not_found(description=None)

給出404 NOT FOUND響應(yīng)

render(template, qcontext=None, lazy=True, **kw)

渲染qweb模板袱饭,在調(diào)度完成后會(huì)對(duì)給定的模板進(jìn)行渲染川无,同時(shí)模板和qcontext可以被靜態(tài)響應(yīng)修改或替換

參數(shù):

  1. template (basestring) -- 用于渲染的模板
  2. qcontext (dict) -- 用于渲染的上下文環(huán)境
  3. lazy (bool) -- 渲染動(dòng)作是否應(yīng)該拖延到最后執(zhí)行
  4. kw -- 轉(zhuǎn)發(fā)到werkzeug響應(yīng)對(duì)象

class odoo.http.JsonRequest(*args)

處理通過(guò)http發(fā)來(lái)的json rpc格式請(qǐng)求

說(shuō)明:
1.method -- 忽略
2.params -- 須是一個(gè)json格式對(duì)象
3.處理方法返回的結(jié)果是一個(gè)json-rpc格式的,以JSON-RPC Response對(duì)象的形式組裝

正確的請(qǐng)求:

--> {"jsonrpc": "2.0",
     "method": "call",
     "params": {"context": {},
                "arg1": "val1" },
     "id": null}

<-- {"jsonrpc": "2.0",
     "result": { "res1": "val1" },
     "id": null}

出錯(cuò)的請(qǐng)求:

--> {"jsonrpc": "2.0",
     "method": "call",
     "params": {"context": {},
                "arg1": "val1" },
     "id": null}

<-- {"jsonrpc": "2.0",
     "error": {"code": 1,
               "message": "End user error message.",
               "data": {"code": "codestring",
                        "debug": "traceback" } },
     "id": null}

響應(yīng)

class odoo.http.Response(*args, **kw)

響應(yīng)對(duì)象通過(guò)控制器的路由傳遞虑乖,在werkzeug.wrappers.Response之外懦趋,該類的構(gòu)造方法會(huì)添加以下參數(shù)到qweb的渲染中

  1. template (basestring) -- 用于渲染的模板
  1. qcontext (dict) -- 用在渲染中的上下文環(huán)境
  2. uid (int) -- 用于調(diào)用ir.ui.view渲染的用戶id,None時(shí)使用當(dāng)前請(qǐng)求的id

上面的參數(shù)在實(shí)際渲染之前可以隨時(shí)作為Response對(duì)象的屬性修改

  • render() - 渲染響應(yīng)對(duì)象的模板疹味,并返回內(nèi)容
  • flatten() - 強(qiáng)制渲染響應(yīng)對(duì)象的模板仅叫,將結(jié)果設(shè)置為響應(yīng)主體,并將模板復(fù)原

控制器

控制器像Model一樣需要定義成可擴(kuò)展的糙捺,但不能用同樣的機(jī)制诫咱,所以采用了另外一套機(jī)制
一般通過(guò)繼承的形式創(chuàng)建:class odoo.http.Controller
以route裝飾器來(lái)裝飾定義的方法:

class MyController(odoo.http.Controller):
    @route('/some_url', auth='public')
    def handler(self):
        return stuff()

為了覆蓋一個(gè)controller,可以繼承它并將相關(guān)方法都覆蓋:

class Extension(MyController):
    @route()
    def handler(self):
        do_before()
        return super(Extension, self).handler()
  • 需要通過(guò)route裝飾器來(lái)讓controller方法對(duì)外部可訪問(wèn)洪灯,如果函數(shù)被重定義時(shí)沒(méi)有route裝飾坎缭,它就會(huì)對(duì)外面不可見(jiàn)。
  • 裝飾器方法是相關(guān)聯(lián)的签钩,如果覆蓋的方法沒(méi)有參數(shù)那么原方法參數(shù)會(huì)自動(dòng)保留掏呼;如果覆蓋方法有提供參數(shù)就會(huì)將原參數(shù)覆蓋,如:
#下例會(huì)將handler方法由public變?yōu)閡ser認(rèn)證模式铅檩,需要登錄
class Restrict(MyController):
    @route(auth='user')
    def handler(self):
        return super(Restrict, self).handler()

譯自odoo官方文檔:http://www.odoo.com/documentation/10.0/reference/security.html憎夷,http://www.odoo.com/documentation/10.0/reference/testing.html ,http://www.odoo.com/documentation/10.0/reference/http.html,不當(dāng)之處歡迎批評(píng)指正。

內(nèi)容發(fā)布自http://www.reibang.com/u/6fdae8ec06bc昧旨,轉(zhuǎn)載請(qǐng)注明出處

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拾给,一起剝皮案震驚了整個(gè)濱河市祥得,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蒋得,老刑警劉巖级及,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異窄锅,居然都是意外死亡创千,警方通過(guò)查閱死者的電腦和手機(jī)缰雇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門入偷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人械哟,你說(shuō)我怎么就攤上這事疏之。” “怎么了暇咆?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵锋爪,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我爸业,道長(zhǎng)其骄,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任扯旷,我火速辦了婚禮拯爽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘钧忽。我一直安慰自己毯炮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布耸黑。 她就那樣靜靜地躺著桃煎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪大刊。 梳的紋絲不亂的頭發(fā)上为迈,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音缺菌,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛昆箕,可吹牛的內(nèi)容都是我干的薯嗤。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了窟社?” 一聲冷哼從身側(cè)響起灿里,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤跪楞,失蹤者是張志新(化名)和其女友劉穎缕碎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡耸成,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年岳链,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苗分。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡服猪,死狀恐怖叉瘩,靈堂內(nèi)的尸體忽然破棺而出薇缅,到底是詐尸還是另有隱情汤徽,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布壳鹤,位于F島的核電站讯嫂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜褥符,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望铣焊。 院中可真熱鬧逊朽,春花似錦、人聲如沸曲伊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)坟募。三九已至岛蚤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間懈糯,已是汗流浹背涤妒。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留昂利,地道東北人届腐。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蜂奸,于是被迫代替她去往敵國(guó)和親犁苏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容