Django - 如何限制哪个用户可以连接到套接字?

Posted

技术标签:

【中文标题】Django - 如何限制哪个用户可以连接到套接字?【英文标题】:Django - How to restrict which user can connect to the socket? 【发布时间】:2017-04-04 06:18:49 【问题描述】:

我正在为应用程序channels 使用 django 通道,并且我想限制对套接字的访问(仅限授权用户)。

有这个:

@channel_session_user_from_http
def connect_blog(message, username):
    user = message.user

    try:
        user_blog = User.objects.get(username=username)
        has_perm = user_blog.check_perm(user.pk)
        if not has_perm:
            return
    except ObjectDoesNotExist:
        message.reply_channel.send(
            # WebSockets send either a text or binary payload each frame.
            # We do JSON over the text portion.
            "text": json.dumps("error": "bad_slug"),
            "close": True,
        )
        return
    Group(user_blog.group_name).add(message.reply_channel)

但是当我检查权限已经连接到套接字时,我该如何控制呢? (如何关闭套接字或控制这种情况)。

感谢和问候。

【问题讨论】:

那么,你找到解决办法了吗? @AnnShress 不,还没有。 @AnnShress in django-channels >= 2.0 你可以使用 AuthMiddlewareStack 距离上次查看频道已经很久了。但感谢您提供的信息。 【参考方案1】:

有一个关于 Django 频道的good tutorial。

我的身份验证解决方案:

async def connect(self):
    self.user = self.scope["user"]
    self.room_name = self.scope['url_route']['kwargs']['id']
    self.room_group_name = 'chat_%s' % self.room_name

    if self.user.is_authenticated: # also you can add more restrictions here
        await self.channel_layer.group_add(
            self.room_group_name,
            self.channel_name
        )
        await self.accept()

不要忘记根中的routing.py

from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
import rooms.routing

application = ProtocolTypeRouter(
    # (http->django views is added by default)
    'websocket': AuthMiddlewareStack(
        URLRouter(
            rooms.routing.websocket_urlpatterns
        )
    ),
)

你可以查看我的consumers.pyhere的完整代码。

【讨论】:

以上是关于Django - 如何限制哪个用户可以连接到套接字?的主要内容,如果未能解决你的问题,请参考以下文章

Django 通道套接字未连接到消费者

Django - Oracle,如何使用为用户提供的用户/密码连接到只读数据库

如何将会话变量连接到 Django 中的登录用户?

在将用户连接到服务器之前,如何等待 Socket.IO 建立套接字连接?

OperationalError:无法通过套接字连接到本地 MySQL 服务器

当socket server和views.py分成两个文件时,如何通过Django视图发送套接字消息?