4

django-socketio を使用してクライアント (JS) からサーバー (django/python) に Socket.IO 接続を介してメッセージが送信されると、ページがレンダリングされたときにどのユーザーが認証されたかを特定できますか?

この場合、ビューはdjangoによって提供されており、認証が必要です-通常はサーバー上で実行できますuser = request.userが、events.pyファイルではオブジェクトrequest.userを返すだけです。AnonymousUserWebsocket サーバーは django Web サーバーとは完全に別のプロセスであり、ユーザーはそのソケット接続で認証されていないため、これは理にかなっています。

サーバーに送信されるメッセージにユーザー ID を埋め込むための巧妙なコードを考え出す必要があると考えています。その場合、エンド ユーザーがスプーフィングできないようにハンドシェイクを追加する必要があります。それ。

この問題に対する巧妙な解決策を思いついた人はいますか?

4

2 に答える 2

4

この問題に対する独自の解決策を見つけました。トリックは、サーバーに送信する前に、session_keydjango オブジェクトからdjango-socketio メッセージに追加することです。request次に、サーバー側に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)

利益!

于 2012-12-12T19:43:58.327 に答える
0

skandocious による回答で余分なデータベース ヒットを避けるために、Django のキャッシュされたセッションを使用できます。これには、選択したキャッシング バックエンドを使用するためmemcachedの設定と変更が含まれます。SESSION_ENGINE

于 2015-09-07T08:28:25.240 に答える