2017-02-10 14 views
2

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)戻ってきていますか? 最終的に、どのようにこのシナリオでパーミッションシステムが正しく動作するようにすることができますか?

+0

PermissionDenied以外のログを試みます。あまりにも早く偽に戻ってくるかもしれないと思われます。あなたは合格と交換する必要があるかもしれません –

答えて

1

私はこれに対する実際の答えを恥じるべきです。少なくとも私はそれから学ぶべき教訓があることを願っています。たぶん私はの行に沿って何かを追加することができます "私は自分の実装を最初にチェックする"私のバグ修正ヒューリスティックに。

私は実際にそれらを呼び出すかどうかを調べるために、別のものを返すこれら2つのメソッドの明らかな不可能性が私に検査されました。私は自分自身の実装を完全に忘れていたことがわかりましたhas_perm、私はユーザーのモデルが管理者に準拠するために念入りに作成していません。 この実装は、もちろん、スーパーユーザーのステータスのみをチェックしました。

私はOccamの仲間が何かをしていたと思います。

関連する問題