2016-11-16 4 views
1

Мне нужны данные модели нагрузки через RPC в моем JS.Как предоставить анонимный доступ пользователю к rpc api

Если вы сделаете это

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 слишком

+0

Что ваш вопрос? – Amy

+0

вопрос был в заголовке;) Я добавил знак вопроса в конце текста в любом случае. – simahawk

+0

Вы должны прочитать [это] (https://www.odoo.com/page/responsible-disclosure). Я не думаю, что это принадлежит SO. – CZoellner

ответ

0

Я работаю на модуль, чтобы обеспечить эту функциональность, но всех, кто хочет сделать это быстро и грязно, могут сделать это с помощью следующего кода:

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, и это ошибка, возникающая при сбое. Также кажется, что эта ошибка возникает только при сбое auth для публичного пользователя.

Именование ошибки, однако, заставляет меня думать, что есть некоторые возможные коннотации, связанные с использованием этого хака, которые еще не были полностью идентифицированы.

Что я могу сказать, так это то, что ваши данные будут, по крайней мере, безопасными с этим из-за защищенных прав по умолчанию для Odoo. Я также могу сказать, что базовая функциональность сеанса & проверяет, что все работает нормально, за пределами немного другой ошибки, чем обычно, в случае выхода из одной вкладки, а затем просмотра в другой.

То, что я не могу сказать, - это то, что непреднамеренные побочные эффекты у него на краях с сеансами. Предварительное тестирование показалось прекрасным, но, безусловно, возможны далеко идущие последствия.

Модуль разрабатывается в на в this pull request, с предварительным названием web_session_allow_public