私のプロジェクトでは、カスタム認証バックエンドを使用してユーザー権限を管理し、認証自体はそのままにしておきます (Django によって処理されます)。バックエンドはそれ自体で正常に動作しますが、Django WebTest を使用して構築されたテストで失敗し始めました。調べてみたところ、原因は DWT による別の認証バックエンドの挿入であることがわかりましたsettings.AUTHENTICATION_BACKENDS
。
私のバックエンドは Django のものを直接拡張しますがModelBackend
、DWT 自身のバックエンドは に基づいていますがRemoteUserBackend
、これは最終的には の拡張でもありModelBackend
ます。DWT はメソッドを定義していませんが、has_perm
それでもバックエンドに存在するため、このビットは重要です。
は、テストを実行するときに、問題のユーザー オブジェクトdjango.contrib.auth.backends.ModelBackend
のget_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 の作成者による見落としですか? テスト中にカスタム許可ロジックを使い続けるにはどうすればよいですか?