2013-04-17 7 views
8

私は自分のWebサイトにdjango authを使用しています。これにはセッションミドルウェアがインストールされている必要があります。Djangoで匿名ユーザーのCookieを無効にする

Djangoセッションミドルウェアは、匿名ユーザー(認証されていないユーザー)であっても常にセッションCookieを追加します。彼らが認証するとき、クッキーは、ユーザーがログインしていることを示す別のものに置き換えられます。

キャッシング(ワニス)のために匿名ユーザーのCookieを無効にします。

authを使用するアプリケーションに必要なセッションミドルウェアを削除せずに匿名ユーザーのCookieを無効にする方法はありますか?

+0

セッションは、コード内でアクセスまたは変更しないと作成されません。 – sbaechler

答えて

7

セッションデータがprocess_responseのクッキーに設定されています。SessionMiddlewareです。この関数は設定やrequest.userを使用しないため、ユーザーがログインしているユーザーでも匿名ユーザーでも、このメソッドの内部を知る方法はありません。したがって、セッションCookieをブラウザに送信することを無効にすることはできません。

ただし、この機能を使用する場合は、SessionMiddlewareをサブクラス化してprocess_responseを上書きできます。

from django.contrib.sessions.middleware import SessionMiddleware 
from django.conf import settings 

class NewSessionMiddleware(SessionMiddleware): 

    def process_response(self, request, response): 
     response = super(NewSessionMiddleware, self).process_response(request, response) 
     #You have access to request.user in this method 
     if not request.user.is_authenticated(): 
      del response.cookies[settings.SESSION_COOKIE_NAME] 
     return response 

そして、あなたはSessionMiddlewareの代わりにあなたのNewSessionMiddlewareを使用することができます。

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'myapp.middleware.NewSessionMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.middleware.doc.XViewMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
) 
+0

私はサブクラス化について考えましたが、request.user.is_authenticated()はこの種のチェックのためにdbにヒットしましたか?もしそうなら、これはページがロードされるたびにDBにヒットすることを意味しますか? – kollo

+0

'is_authenticated()'はdbにヒットしません。 'request.user'を投入するとdbにヒットし、AuthenticationMiddlewareによって行われます。しかし、これはあなたがとにかくすべての要求で起こりたいと思っています。しかし、 'is_authenticated'は、' request.user'が 'User'のインスタンスであればTrue、Falseのいずれかを返すだけです。もし' request.user'が 'AnonymousUser'のインスタンスであればTrueを返します。 Falseを返します。しかし、それはdbに当たらないでしょう。 –

+0

ありがとう、私はこれに掘り下げます;) – kollo

関連する問題