【问题标题】:Getting User in django-socketio在 django-socketio 中获取用户
【发布时间】:2012-12-10 17:59:54
【问题描述】:

一旦使用 django-socketio 通过 Socket.IO 连接从客户端 (JS) 到服务器 (django/python) 发送消息,是否可以确定在呈现页面时哪个用户通过了身份验证?

在这种情况下,视图由 django 提供,它需要身份验证——通常在服务器上我可以执行 user = request.user,但在 events.py 文件中,request.user 只返回一个 @987654325 @ 目的。这是有道理的,因为 websocket 服务器是一个与 django web 服务器完全不同的进程,因此用户没有在该套接字连接上进行身份验证。

我想我必须想出一些巧妙的代码来将用户 ID 嵌入到发送到服务器的消息中,在这种情况下,我需要添加一些握手以确保结束用户不能欺骗它。

有没有人想出一个聪明的办法来解决这个问题?

【问题讨论】:

标签: javascript python django socket.io


【解决方案1】:

找到了我自己解决此问题的方法。诀窍是在将 django request 对象中的 session_key 添加到 django-socketio 消息中,然后再将其发送到服务器;然后回到服务器端,您可以将session_key 解析回用户对象。代码如下:

模板文件:(由 django 服务器提供)

<input type="hidden" id="session_key" value="{{ request.session.session_key }}">
...
<script type="text/javascript" charset="utf-8">
    function someHandler(action, post_id, some_val){
        var data = {
            'action': action,
            'post_id': post_id,
            'value': some_val,
            'session_key': $("#session_key").val()
        };
        socket.send(data);
    }
</script>

events.py:(由 django-socketio 服务器处理)

from django.contrib.sessions.models import Session
from django.contrib.auth.models import User

def message(request, socket, context, message):
    session = Session.objects.get(session_key=message['session_key'])
    uid = session.get_decoded().get('_auth_user_id')
    user = User.objects.get(pk=uid)

利润!

【讨论】:

  • 这将在每个 on_message 中访问数据库。这真的有必要吗? 固定
  • 我想我可以将用户对象添加到套接字上下文并在访问数据库之前检查它。好点——谢谢。
  • 刚刚看了你建议的代码,不幸的是我认为它完全错过了这里的想法。用户可以不向套接字服务器证明他的身份(即不发送 session_key)是不可能的。但是,也许可以将用户信息缓存在套接字上下文中,这样它就不必在每条消息上都访问数据库。稍后我会研究它并尽可能编辑我的代码
  • 是的,昨天睡觉的时候,我又复习了一遍,得出了同样的结论,但是像 socketio 这样的系统的重点是不要太重,并且访问数据库有点关键.也许将会话用于缓存或redis之类的东西,并且仅验证会话密钥是否有效,并且仅在会话密钥更改时才偶尔(缓存)获取用户。
【解决方案2】:

为了避免 skandocious 的答案中出现额外的数据库命中,可以使用 Django 的 cached sessions。这包括设置 memcached 并修改 SESSION_ENGINE 设置以使用您选择的缓存后端。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 2021-12-18
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多