Django権限管理(permissions)とユーザーグループ(group)の詳細


もしあなたがDjangoを利用してブログを開発したら、ほとんどのユーザーはあなたの文章を読むだけです。しかし、コンテンツ管理システムを開発したいなら、ユーザーの権限を管理し、コントロールしなければなりません。Django独自の権限機構とユーザーグループは、ユーザー権限を簡単に管理することができます。今日はDjangoが持つ権限管理メカニズムを簡単な言葉で説明してみます。
何が権限ですか
権限は、ユーザの行動を制約し、ページの表示内容を制御することができる仕組みです。一つの完全な権限は3つの要素を含むべきです。ユーザー、対象と権限、つまりどのようなユーザーがどのようなオブジェクトに対してどのような権限を持っていますか?
私たちがブログというアプリケーションを持っているとしたら、Articeというモデルが含まれています。スーパーユーザーは通常以下の4つの権限を持っていますが、普通のユーザーは1つまたはいくつかの権限しかないかもしれません。例えば、記事を見たり、記事を作成したりすることができますが、変更や削除はできません。
  • 文章を調べます。
  • 作成記事(add)
  • 変更記事
  • 記事を削除する
  • 私たちはDjangoのadminの中でユーザーに権限を簡単に割り当てることができます。
    Django Adminにおける権限割り当て
    Djangoにおけるユーザー権限の割り当ては、主にDjangoが持参するAdminインターフェースを通じて維持されている。あるuser情報を編集すると、User permissions欄で簡単にいくつかのモデルを調べたり、変更したり、削除したりすることができます。 
    Djangoの権限permissionの本質はdjang.com ntrib.authのモデルであり、Userのuser_とpermissionsフィールドは多対多の関係です。私たちはINSTALLEDにいます。APPにauthアプリケーションを追加すると、Djangoはあなたがインストールしたアプリのモデルごとに4つのオプションの権限を自動的に作成します。view、add、change、delete。注:Django 2.0前にviewの権限がありません)。その後、adminを通じてこれらの権限を異なるユーザーに割り当てることができます。
    ユーザの権限を表示
    権限名は一般的にアプリ名があります。label)は、権限動作とモデル名で構成されています。ブログの応用例として、DjangoはArtcleモデルのために自動的に作成された4つのオプションの権限名です。それぞれ:
  • 閲覧記事(view):blog.view_アート
  • 作成文章(add):blog.add_アート
  • 変更記事(change):blog.change_アート
  • 文章を削除する:blog.delete_アート
  • 前の例では、Adminを通じてユーザーAに送りました。A)記事の作成と文章の変更の権限が割り当てられています。今はuser.has_が使えます。perm()方法は、ユーザが既に対応する権限を持っているかどうかを判断する。次の例ではTrueに戻るべきです。
  • user_A.has_perm('blog.add_アートギャラリー
  • user_A.has_perm('blog.change_アートギャラリー
  • ユーザーグループから取得した権限を含む、あるユーザーグループの権限またはユーザーのすべての権限を確認する場合、私たちはget_を使用することができます。グループpermissionsとget_all_permissionsの方法。
  • user_A.get_グループpermissions()
  • user_A.get_all_permissions()
  • 手動定義と割り当て権限(Permissions
    djangoが作成した4つのオプションの権限が私たちの要求を満たしてくれない場合があります。実現方法は主に二つあります。次はそれぞれ2つの方法を使ってArtcleモデルに二つの権限を追加します。一つはpublish_です。アートで、一つはコメントです。article
    方法1.Modelのmeta属性にpermissionsを追加します。
    
    class Article(models.Model):
      ...
      class Meta:
        permissions = (
          ("publish_article", "Can publish article"),
          ("comment_article", "Can comment article"),
        )
    
    方法2.ContentTypeを使ってプログラム化してpermissionsを作成します。
    
    from blog.models import Article
    from django.contrib.auth.models import Permission
    from django.contrib.contenttypes.models import ContentType
     
    content_type = ContentType.objects.get_for_model(article)
    permission1 = Permission.objects.create(
      codename='publish_article',
      name='Can publish articles',
      content_type=content_type,
    )
     
    permission2 = Permission.objects.create(
      codename='comment_article',
      name='Can comment articles',
      content_type=content_type,
    )
    
    python manager.py migrateコマンドを使用すると、Django adminのuser permissions欄がまた二つのオプション権限を持つことが分かります。
    いつもadminを通してユーザーに権限を設定したくないなら、コードの中で手動でユーザーに権限を割り当てることもできます。ここにも二つの実現方法があります。
    方法1.user.user_を使用するpermissions.add()方法
    
    myuser.user_permissions.add(permission1, permission2, ...)
    
    方法2.userがいるユーザグループを通じてユーザに権限を追加する
    
    mygroup.permissions.add(permission1, permission2, ...)
    
    ユーザーの権限をコードから削除したいなら、removeまたはclear方法を使用してもいいです。
    
    myuser.user_permissions.remove(permission, permission, ...)
    myuser.user_permissions.clear()
    注意権限のキャッシュメカニズム
    Djangoは、ユーザオブジェクトごとに、その権限を含むuser_をキャッシュします。permissionsコードの中で手動でユーザーの権限を変更した場合、ユーザーオブジェクトを再取得しなければなりません。最新の権限を取得できません。
    例えば、次の例ではユーザーに手動でchange_を追加しました。Blogpostの権限は、ユーザーに再ロードしないと、ユーザーはまだchange(u)がないと表示されます。blogpostの権限。
    
    from django.contrib.auth.models import Permission, User
    from django.contrib.contenttypes.models import ContentType
    from django.shortcuts import get_object_or_404
     
    from myapp.models import BlogPost
     
    def user_gains_perms(request, user_id):
      user = get_object_or_404(User, pk=user_id)
      # any permission check will cache the current set of permissions
      user.has_perm('myapp.change_blogpost') 
     
      content_type = ContentType.objects.get_for_model(BlogPost)
      permission = Permission.objects.get(
        codename='change_blogpost',
        content_type=content_type,
      )
      user.user_permissions.add(permission)
     
      # Checking the cached permission set
      user.has_perm('myapp.change_blogpost') # False
     
      # Request new instance of User
      # Be aware that user.refresh_from_db() won't clear the cache.
      user = get_object_or_404(User, pk=user_id)
     
      # Permission cache is repopulated from the database
      user.has_perm('myapp.change_blogpost') # True
    
    ユーザ権限の検証(Validation)
    前にユーザー権限の作成と設定について説明しましたが、今はキーの一環としてユーザー権限の検証に入ります。私たちは権限を割り当てた後、ビュービュービュービュービューのviews.pyとテンプレートの中でユーザーが相応の権限を持っているかどうかを確認します。そうでないと、前に設定した権限は虚偽のものとなります。これはなぜ前の多くのdjangoの実戦事例で、ユーザーにあるモデルのaddとchangeの権限を割り当てていないのか、ユーザーはまだオブジェクトを作成し編集することができるからです。
    1.ビューでの検証
    ビューではもちろんuser.has_を使用できます。perm方法はユーザーの権限を直接検証する。もちろんもっといい方法は@permission_を使うことです。この飾り器はrequiredです。permission_required(perm, login_url=None, raise_exception=False)あなたがロゴを指定したらユーザは先にログインするように要求されます。あなたがライセを設置したらexception=Trueは、ログインページにジャンプすることなく、直接に403の権限なしエラーを返します。使用方法は以下の通りです。
    
    from django.contrib.auth.decorators import permission_required
     
    @permission_required('polls.can_vote')
    def my_view(request):
      ...
    
    関数ビューではなくクラスビューを使用すると、Permission RequiredMixinのクラスを継承する必要があります。
    
    from django.contrib.auth.mixins import PermissionRequiredMixin
     
    class MyView(PermissionRequiredMixin, View):
      permission_required = 'polls.can_vote'
      # Or multiple of permissions:
      permission_required = ('polls.can_open', 'polls.can_edit')
    
    2.テンプレートでの検証
    テンプレートでユーザー権限を検証するには、主にpermsという大域変数を使用することを学ぶ必要がある。perms現在のユーザに対するuser.has_module_permsとuser.has_perm法を実装した。私達は現在のユーザーがブログの応用下のすべての権限を持っているかどうかを判断する必要があります。
    
    {{ perms.blog }}
    現在のユーザーがブログの応用下で文章討論を発表する権限を持っているかどうかを判断すれば、次のように使います。
    
    {{ perms.blog.comment_article }}
    このようにtemplateのifタグを組み合わせると、現在のユーザーが持つ権限を判断することによって、異なる内容を表示することができます。
    
    {% if blog.article %}
      <p>You have permission to do something in this blog app.</p>
      {% if perms.blog.add_article %}
        <p>You can add articles.</p>
      {% endif %}
      {% if perms.blog.comment_article %}
        <p>You can comment articles!</p>
      {% endif %}
    {% else %}
      <p>You don't have permission to do anything in the blog app.</p>
    {% endif %}
    
    ユーザグループ(グループ)
     ユーザグループ(Group)とUserモデルはマルチペアの関係です。その役割は、権限制御時に、一人のユーザによる割り当てなしに、ユーザの権限を一括して管理し、分配することができ、仕事量を節約することができる。一つのユーザを一つのグループに加えると、そのユーザはグループに割り当てられたすべての権限を持つ。例えば、ユーザーグループeditorsに権限があれば、change_articleは、エディットグループに属するすべてのユーザーにこの権限があります。
    ユーザーをユーザーグループに追加したり、ユーザーグループに権限を追加したりする場合、直接django adminを通じて行うことが望ましい。グループに手動で権限を追加または削除したい場合は、次の方法が使えます。
    
    mygroup.permissions = [permission_list]
    mygroup.permissions.add(permission, permission, ...)
    mygroup.permissions.remove(permission, permission, ...)
    mygroup.permissions.clear()
    
    ユーザーのグループを削除するには、次のような方法があります。
    
    myuser.groups.remove(group, group, ...) #
    myuser.groups.clear()
    
    Djangoが持つ権限機構の不足
    Djangoが所有する権限機構はモデルに対するものであり、これはユーザーがArtcleモデルに対してchangeの権限を持っているということを意味し、このユーザはすべての記事オブジェクトを修正する権限を得る。私たちが個々の文章の対象に対する権限管理を実現するには、django Gardianなどの第三者ライブラリを借りる必要があります。このライブラリの使用については、後で詳しく紹介します。
    ここでは、Django権限管理(permissions)とユーザーグループの詳細な文章を紹介します。これに関連するDjango権限管理とユーザーグループの内容については、以前の文章を検索してください。または、下記の関連記事を引き続きご覧ください。これからもよろしくお願いします。