AbstractBaseUser
から継承したカスタムユーザーモデルを使ってDjango(1.10.3)プロジェクトを開始しました。数週間かけて開発を進めた結果、adminユーザーのためのより詳細な権限が必要であることがわかりましたので、PermissionsMixin
でユーザーモデルを拡張し、マイグレーションを生成して適用し、ModelAdmin
を更新しました。なぜ管理サイトは私のカスタムユーザの権限を気にしませんか?
試すにはスーパーユーザーで管理者にログインし、すべての権限が手動で追加された新しいユーザーを作成しました。その新しいユーザーでログインしたときに、「あなたは何か編集する権限がありません」と挨拶されました。
私はシェルに行って、ユーザーのアクセス許可を確認して、そこにいました。
>>> u = User.objects.get(username='new_user')
>>> u.get_all_permissions()
{'admin.add_logentry', ...}
ユーザーがアクティブスーパーでない場合は、
>>> u.has_perm('admin.add_logentry')
False
は今、何has_perm
はこれを呼び出すことで、行います
def _user_has_perm(user, perm, obj):
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
しかし、
>>> from django.contrib.auth import get_backends
>>> backend = get_backends()[0] # django.contrib.auth.backends.ModelBackend
>>> backend.has_perm(u, 'admin.add_logentry')
True
ので、
はなぜ異なる値をuser.has_perm(perm)
とbackend.has_perm(user, perm)
戻ってきていますか? 最終的に、どのようにこのシナリオでパーミッションシステムが正しく動作するようにすることができますか?
PermissionDenied以外のログを試みます。あまりにも早く偽に戻ってくるかもしれないと思われます。あなたは合格と交換する必要があるかもしれません –