使用 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 的发行说明中列出。
我基本上是在寻找 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 的发行说明中列出。