2017-08-14 3 views
1

Ich bin im Grunde nach einem login_required/LoginRequiredMixin Äquivalent für Django-Kanäle. Die Dokumente haben einen authentication section, der beschreibt, wie man einen Benutzer erhält, aber es scheint das Bit zu verpassen, wo Sie Benutzern den Zugriff verweigern, die nicht authentifiziert sind.Den Zugriff auf nicht authentifizierte Benutzer mit Djangokanälen verweigern

from channels.generic.websockets import JsonWebsocketConsumer 

class MyConsumer(JsonWebsocketConsumer): 

    channel_session_user = True 

    def connection_groups(self, **kwargs): 
     return ["test"] 

    def connect(self, message, **kwargs): 
     print message.user # AnonymousUser 
     self.send({"accept": True}) # False here still accepts and sends a message 

Wie soll ich die Verbindung verleugnen/Erniedrigungs wenn message.user.is_anonymous wahr ist?

Antwort

2

Verweigern die Verbindung auf Verbindungsversuch ist so einfach wie diese: die Nachricht nicht überhaupt akzeptieren senden, wenn Sie eine Verbindung nicht aufbauen wollen. Kanäle schließen es automatisch nach einer konfigurierten Zeitspanne (standardmäßig 5 Sekunden oder eine Sekunde).

def connect(self, message, **kwargs): 
    if not message.user.is_anonymous: 
     self.send({"accept": True}) 

Wenn Sie nicht warten, und die Verbindung sofort zu schließen, nur {"close": True} senden statt:

def connect(self, message, **kwargs): 
    if not message.user.is_anonymous: 
     self.send({"accept": True}) 
    else: 
     self.send({"close": True}) 

Aus Gründen der Vollständigkeit, hier ist die Erklärung von den channels docs. Leider sind diese Informationen nicht in der Dokumentation selbst enthalten, nur in den Versionshinweisen zu v1.0.

+0

Kann ein Kanal geschlossen werden oder muss auf das Timeout gewartet werden? – jozxyqk

+0

@jozxyqk: Wenn Sie die Verbindung explizit schließen möchten und nicht auf 'channels' warten wollen, um sie zu schließen, senden Sie' {"close": True} 'anstelle von' {"accept": True} '. Ich werde die Antwort aktualisieren. – hoefling

0

tun Nur soviel:

if user.is_authenticated(): 
    # allow it 
+0

Nur um zu klären, "AnonymousUser.is_authenticated" wird immer false zurückgeben? In meiner Frage wurde auch gefragt, wie ich es ablehnen könnte. – jozxyqk

Verwandte Themen