1

プロジェクトを Django 1.4 から Django 1.5.1 に移行しようとしています ...

Web サービスは、認証済みユーザーと匿名ユーザーの両方としてアクセスできる必要があります。また、Apache モジュール ( https://docs.djangoproject.com/en/1.5/howto/auth-remote-user/に従って "REMOTE_USER" env var を設定) で外部認証を使用します。

URL https://example.com/の内容は、ユーザーが匿名か認証済みかによって異なります。

Django 1.4 で使用した戦略は、/auth/ で始まる URL のみが Apache のモジュールによって認証されるというものでした。ユーザー (ページhttps://example.com/にいる) が認証を選択した場合、ユーザーはhttps://example.com/auth/にジャンプします。/auth/ は Apache のモジュールによって認証され、Django アプリケーションによって提供され、https://example.com/にリダイレクトされます。session_key により、Django はユーザーが認証されていることを認識します。

残念ながら、Django 1.5.1 では ... session_key は、ブラウザーが認証済み URL から非認証 URL に移動するたびに変更されます。

私のログでは、 (Django 1.5.1) を見ることができます:

DEBUG 2013-04-09 09:15:20,571 views home None
DEBUG 2013-04-09 09:15:48,886 views auth ow1bzgdajs7i12d9bmfwwm3fpw47elna
DEBUG 2013-04-09 09:15:48,981 views home mehlf1x0iemx9yc3ddf6mhnls1nha1r4
  • 最初の行は、ユーザーがhttps://example.com/にアクセスしたときです。
  • 次に、「接続」ボタンをクリックしたとき。
  • 3 番目は / への HttpResponseRedirect です。
  • 最後の文字列は request.session.session_key です。

/auth (Django 1.5.1) で apache 認証を削除すると:

DEBUG 2013-04-09 09:16:45,268 views home None
DEBUG 2013-04-09 09:16:48,258 views auth None
DEBUG 2013-04-09 09:16:48,345 views home None

Django 1.4 では、同じログが与えるものは次のとおりです。

DEBUG 2013-04-09 09:11:21,899 views home None
DEBUG 2013-04-09 09:11:41,261 views auth f16ab3e574b866177803f9011dc33ab8
DEBUG 2013-04-09 09:11:41,375 views home f16ab3e574b866177803f9011dc33ab8

この動作の変更は予想されますか? (新機能?) どうすれば修正できますか?

ありがとう!

4

2 に答える 2

1

Aymeric が言及したように、これは Django 1.5 で登場した意図的なバグ修正です。:) :(

私たちの場合、Apache のモジュールが "REMOTE_USER" 変数を提供しなくなった場合でも、セッションを維持する必要があります。これを解決するために、2 つの可能性を見つけました。

  1. RemoteUserMiddleware をサブクラス化し、コード auth.logout(request) なしでメソッド process_request のみを再定義します。
  2. 必要に応じてユーザー名を REMOTE_USER に挿入する自家製のミドルウェアを挿入します。

私は 2 番目の可能性を選択しました。これは、Django の今後のバージョンに適応するための労力がゼロになる/ゼロであるべきだからです。

私のsettings.pyで、'main.middleware.persistant_session_middleware'直前に追加しました'django.contrib.auth.middleware.RemoteUserMiddleware'

main/middleware.py でpersistant_session_middlewareを定義:

class persistant_session_middleware(object):
def __init__(self):
    pass

def process_request(self, request):
    header = "REMOTE_USER"

    if request.user.is_authenticated() and not header in request.META:
        request.META[header] = request.user.username
    return None

これがセキュリティホールにならないことを願うばかりです!しかし、それが依存している限り、request.user.is_authenticated()私たちは安全だと思います:)

于 2013-04-15T14:02:32.870 に答える