0

私のプロジェクトでは、カスタム認証バックエンドを使用してユーザー権限を管理し、認証自体はそのままにしておきます (Django によって処理されます)。バックエンドはそれ自体で正常に動作しますが、Django WebTest を使用して構築されたテストで失敗し始めました。調べてみたところ、原因は DWT による別の認証バックエンドの挿入であることがわかりましたsettings.AUTHENTICATION_BACKENDS

私のバックエンドは Django のものを直接拡張しますがModelBackend、DWT 自身のバックエンドは に基づいていますがRemoteUserBackend、これは最終的には の拡張でもありModelBackendます。DWT はメソッドを定義していませんが、has_permそれでもバックエンドに存在するため、このビットは重要です。

は、テストを実行するときに、問題のユーザー オブジェクトdjango.contrib.auth.backends.ModelBackendget_all_permissions()アクセス許可をキャッシュします。has_perm

    if not hasattr(user_obj, '_perm_cache'):
        user_obj._perm_cache = {
            *self.get_user_permissions(user_obj),
            *self.get_group_permissions(user_obj),
        }
    return user_obj._perm_cache

DWT のバックエンドが最初にテストされるため、キャッシュにデータが取り込まれ、バックエンドによって設定されたアクセス許可が含まれず、最終的にhas_permテストが失敗します。Django 内からコード スニペットを参照します。

def _user_has_perm(user, perm, obj):
    """
    A backend can raise `PermissionDenied` to short-circuit permission checking.
    """
    for backend in auth.get_backends():
        if not hasattr(backend, 'has_perm'):
            continue
        try:
            if backend.has_perm(user, perm, obj):
                return True
        except PermissionDenied:
            return False
    return False

バックエンドで何か間違ったことをしているのですか、それとも DWT の作成者による見落としですか? テスト中にカスタム許可ロジックを使い続けるにはどうすればよいですか?

4

0 に答える 0