使用 Django 频道拒绝未经身份验证的用户访问

Deny access to unauthenticated users with django channels

我基本上是在寻找 Django 频道的 login_required/LoginRequiredMixin 等价物。文档有一个 authentication section,它描述了如何获得用户,但它似乎遗漏了您实际上拒绝访问未经身份验证的用户的位。

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

如果 message.user.is_anonymous 是真的,我应该如何 denying/dropping 连接?

只需这样做:

if user.is_authenticated():
    # allow it

在连接尝试时拒绝连接就这么简单:如果您不想建立连接,则根本不要发送接受消息。频道将在配置的时间后自动关闭它(默认情况下为 5 秒或类似时间)。

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

如果您不想等待并立即关闭连接,只需发送 {"close": True} 即可:

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

为了完整起见,这里是channels docs的解释。遗憾的是,此信息未在文档本身中列出,仅在 v1.0 的发行说明中列出。