2016-11-16 3 views
1

Ich brauche Modelldaten über RPC in meinem JS laden.wie anonymen Benutzer Zugriff auf rpc api geben

Wenn Sie dies tun

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

Sie SessionExpiredError bekommen, weil diese Steuerung nur für authentifizierte Benutzer erlaubt ist. Um dies zu umgehen, sollten Sie jedes Mal, wenn Sie etwas benötigen, Ihren eigenen Controller definieren, was sehr schade ist, da die API bereits vorhanden ist.

Ich habe die folgende Problemumgehung im Moment:

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) 

Zugriffsrechte Modell gut durch ACLs behandelt scheint aber sicher zu bleiben, ich bin Aktivieren Sie dies nur für einige Modelle.

Wenn dies auf Sicherheitsstufe kein Problem ist, könnten wir darüber nachdenken, öffentlichen Zugang zum Standard-Controller zu erlauben. Irgendwelche Zeiger?

wurde Dies könnte zu https://github.com/OCA/web/pull/402 Zusammenhang zu

+0

Was ist Ihre Frage? – Amy

+0

Die Frage war im Titel;) Ich habe am Ende des Textes trotzdem ein Fragezeichen angehängt. – simahawk

+0

Sie sollten [diese] (https://www.odoo.com/page/responsible-disclosure) lesen. Ich glaube nicht, dass das zu SO gehört. – CZoellner

Antwort

0

ich auf einem Modul arbeite diese Funktionalität zu bieten, aber alle, die dies schnell zu tun und schmutzig, kann dies mit dem folgenden Code:

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() 

Das Obige versucht eine Benutzerauthentifizierung, authentifiziert sich dann explizit als öffentlicher Benutzer auf einer SessionExpiredError. Dies ist die Methode, die für die Authentifizierung bei einer RPC-Sitzung verwendet wird. Dies ist der Fehler, der beim Fehlschlagen ausgelöst wird. Es scheint auch, dass dieser Fehler nur ausgelöst wird, wenn Authentifizierung für öffentliche Benutzer fehlschlägt.

Die Benennung des Fehlers jedoch lässt mich denken, dass es einige mögliche Konnotationen in Verbindung mit der Verwendung dieses Hacks gibt, die noch nicht vollständig identifiziert wurden.

Was ich sagen kann, ist, dass Ihre Daten zumindest sicher sein werden, aufgrund der standardmäßigen sicheren Berechtigungen von Odoo. Ich kann auch sagen, dass grundlegende Sitzung Funktionalität & Tests scheinen alle als normal zu funktionieren, außerhalb eines etwas anderen Fehlers als normal im Falle der Abmeldung in einem Tab dann Browsen in einem anderen.

Was ich nicht sagen kann ist, welche unbeabsichtigten Nebenwirkungen dies auf Randfälle mit Sitzungen hat. Vorversuche schienen in Ordnung zu sein, aber es gibt durchaus mögliche weitreichende Konsequenzen.

Das Modul wird auf in this pull request arbeitet in, mit einem vorläufigen Namen web_session_allow_public

Verwandte Themen