【问题标题】:how to give anonymous user access to rpc api如何让匿名用户访问 rpc api
【发布时间】:2017-03-30 13:59:25
【问题描述】:

我需要在我的 JS 中通过 RPC 加载模型数据。

如果你这样做

ajax.jsonRpc("/web/dataset/call_kw", 'call', {
            model: 'res.partner.category',
            method: 'search_read',
[...]

你会得到一个 SessionExpiredError 因为这个控制器只允许经过身份验证的用户使用。要解决这个问题,您应该在每次需要这样的东西时定义您的自定义控制器,这很遗憾,因为 api 已经在那里了。

我目前有以下解决方法:

JS:

ajax.jsonRpc("/web/dataset/call_kw_pub", 'call', {
            model: 'res.partner.category',
            method: 'search_read',
[...]

PY:

from openerp.addons.web.controllers.main import DataSet as DataSetBase

class DataSet(DataSetBase):
    @http.route([
        '/web/dataset/call_kw_pub',
        '/web/dataset/call_kw_pub/<path:path>'
    ], type='json', auth="public")
    def call_kw_pub(self, model, method, args, kwargs, path=None):
        if model not in ('partner.project.expertise', 'res.partner.category'):
            return http.request.not_found()
        return self._call_kw(model, method, args, kwargs)

ACL 似乎很好地处理了模型的访问权限,但为了保证安全,我只为某些模型启用了此功能。

如果这不是安全级别的问题,那么我们可以考虑允许公共访问标准控制器。有什么指点吗?

这也可能与https://github.com/OCA/web/pull/402有关

【问题讨论】:

  • 你有什么问题?
  • 问题在标题中;)无论如何,我在文本末尾添加了一个问号。
  • 您应该阅读this。我不认为这属于 SO。
  • @CZoellner 这不是错误,是关于我的解决方法的问题。
  • 好的,但在最后一次编辑之前,“安全漏洞”在标题中;-)

标签: javascript web openerp rpc anonymous


【解决方案1】:

我正在开发一个模块来提供此功能,但任何想要快速而肮脏的人都可以使用以下代码来实现:

from openerp import models
from openerp.http import SessionExpiredException


class IrHttp(models.Model):

    _inherit = 'ir.http'

    def _auth_method_user(self):
        try:
            return super(IrHttp, self)._auth_method_user()
        except SessionExpiredException:
            return self._auth_method_public()

上述尝试进行用户身份验证,然后在SessionExpiredError 上显式重新身份验证为公共用户。这是用于通过 RPC 会话进行身份验证的方法,这是失败时抛出的错误。似乎只有当公共用户的身份验证失败时才会引发此错误。

但是,错误的命名让我认为使用此 hack 可能涉及一些尚未完全确定的含义。

我可以说的是,由于 Odoo 的默认安全权限,您的数据至少会受到保护。我还可以说,基本会话功能和测试似乎都正常工作,除了在一个选项卡中注销然后在另一个选项卡中浏览的情况下与正常情况略有不同的错误。

我不能说这对带有会话的边缘情况有什么意想不到的副作用。初步测试似乎很好,但肯定有可能产生深远的影响。

该模块正在this pull request 中工作,初步名称为web_session_allow_public

【讨论】:

    猜你喜欢
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    • 2020-01-31
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多