Odoo 会话管理、web 接口请求安全验证

Odoo 使用 cookie 来携带 session_id, session id 是一个哈希值,在 odoo/http.py setup session 之中可以看到,除了通过 cookie 携带,还可以通过请求的参数携带,或者 http header 中携带 session id。这里只讨论使用 cookie 携带 session id 的情形。

    def setup_session(self, httprequest):
        # recover or create session
        session_gc(self.session_store)

        sid = httprequest.args.get('session_id')
        explicit_session = True
        if not sid:
            sid =  httprequest.headers.get("X-Openerp-Session-Id")
        if not sid:
            sid = httprequest.cookies.get('session_id')
            explicit_session = False
        if sid is None:
            httprequest.session = self.session_store.new()
        else:
            httprequest.session = self.session_store.get(sid)
        return explicit_session

session id 会对应一个文件存在于文件系统之中,如果在 Linux 中,并且没有特意配置过,在 ~/.local/share/Odoo Product Name/下面,Odoo Product Name 是产品名称是可以配置的,这个目录实际上是 Odoo 默认的 data dir。如果启动的时候指定 data dir,session 存储的位置也会改变。data dir 下面 filestore 目录,存储 Odoo 文件(按照数据库名称不同再分一层目录),曾经有朋友问过,Odoo 的文件存数据库吗,大概率不是的,文件一般存在这里。

session id 对应的文件里面存储真正的 session 信息,主要是用户 id,数据库,用户语言等等一些用户的上下文信息。如果系统有这个上下文信息说明用户正在和系统对话,并且已经获得了系统的认证,不需要用户每次执行操作都提供用户名和密码重新获得授权。

session 的建立过程就是用户登录过程,用户登录成功即获得了一个有效的 session 存于 Odoo 的后台系统;当然任何非法的访问,肯定是无法取得一个 session 的,如果能取得 session 就是合法访问。

Odoo 用户在登录系统的时候会要求数据用户名和密码,有的还要求提供数据库名称。用户名密码通过表单 POST 到 web/login,web/login 同时支持 GET 和 POST,GET 就是返回 HTML 页面,POST 就是提交用户名密码验证用户。

POST 登录表单的时候必须要提供一个 csrf token,这个是 Odoo 的一个增强的安全机制。csrf token 是通过 GET web/login 这个页面的时候,Odoo 后台生成写到网页表单的隐藏 input 里面。这样当用户 POST 表单的时候会把csrf token携带过来。

csrf token 有两种,一种是包含最大时间戳的,就是说这个 token 会过期,登录的时候使用的 csrf token 就是有时间戳要求的。而其他 Odoo http 请求都是不用携带时间戳的 csrf token。携带时间戳的 csrf token 一般通过后台生成 html 的时候写成隐藏 input 元素放在表单里面;不带时间戳的 token 会通过 odoo 这个全局的 js 对象获取(后台生成 js 代码)。比如下载一个系统的图片或者附件都是需要这个csrf token 的这个token 就不需要 max ts (时间戳)。

如果 POST web/login 成功,Odoo 会发送一个重定位请求,让前端浏览器访问 web/,这时候同时 set 了 cookie 其中就包含了授权的 session id,这样再请求 web,Odoo 后台就给前端设置好一个 odoo js 对象并且包含了 session 信息,即前端的 js 可以直接通过 odoo js 对象访问到 session 对象。

重定向成功后,就可以进行授权操作了,所有的 Odoo Jsonrpc ,都能正常执行了。当然每次请求要带上 设置了 session id 的 Cookie;要求提供 csrf token 的api 还要提供csrf token,很多 api 不要求 csrf token,是否要求看看 controller 中的接口装饰,默认是要求提供。

    @http.route('/web/database/create', type='http', auth="none", methods=['POST'], csrf=False)
    def create(self, master_pwd, name, lang, password, **post):
        try: ....

指定了 False 就是不要求。上边的创建数据库操作就是不要求提供 csrf token。


    @http.route('/web/binary/upload_attachment', type='http', auth="user")
    @serialize_exception
    def upload_attachment(self, callback, model, id, ufile):
        files = request.httprequest.files.getlist('ufile')
        Model = request.env['ir.attachment']
        out = """<script language="javascript" type="text/javascript">
                    var win = window.top.window;
                    win.jQuery(win).trigger(%s, %s);
                </script>"""
        args = []

而这个上传 attachment 的操作就必须要提供 csrf token,注意的是 csrf token 必须要通过表单参数提交。JSONRPC 没有 csrf token 的需要。

退出系统应该不用介绍了吧。自己找找看吧 😄!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342