Django 권한 관리(permissions) 및 사용자 그룹(group) 상세 정보

만약 당신이 단지 Django를 이용하여 블로그를 개발한다면, 대부분의 사용자들은 당신의 글을 읽을 뿐, 당신은 이 절의 내용을 전혀 사용하지 못할 수도 있습니다.그러나 내용 관리 시스템이나 사용자 관리 시스템을 개발하려면 사용자의 권한을 관리하고 제어해야 한다.Django 자체 권한 메커니즘(permissions)과 사용자 그룹(group)은 사용자 권한을 편리하게 관리할 수 있습니다.편집자 저는 오늘 Django가 가지고 있는 권한 관리 메커니즘을 어떻게 사용하는지 간단명료한 언어로 설명해 보겠습니다.
권한이란 무엇입니까?
권한은 사용자의 행동을 제약하고 페이지의 표시 내용을 제어할 수 있는 메커니즘이다.하나의 완전한 권한은 사용자, 대상과 권한, 즉 사용자가 어떤 대상에 대해 어떤 권한을 가지고 있는지 세 가지 요소를 포함해야 한다.
만약에 우리가 블로그라는 응용 프로그램이 있다면, 그것은Article라는 모델을 포함한다.그러면 수퍼유저는 일반적으로 다음과 같은 4가지 권한을 가진다. 그러나 일반 사용자는 문장만 볼 수 있거나 문장을 보고 만들 수 있지만 수정하고 삭제할 수 없다.
  • 기사 보기(view)
  • 문장 만들기(add)
  • 문장 변경(change)
  • 글 삭제(delete)
  • 우리는 Django의 admin에서 사용자에게 쉽게 권한을 할당할 수 있습니다.
    Django Admin의 권한 할당
    Django의 사용자 권한 할당은 주로 Django 자체 Admin 인터페이스를 통해 유지됩니다.사용자 정보를 편집할 때, 사용자 권한 표시줄에서 특정한 모델에 대한 보기, 추가, 변경, 삭제 권한을 설정할 수 있습니다. (아래 그림과 같습니다.) 
    Django의 권한 permission 본질은 djang입니다.contrib.auth의 모델, User의user_permissions 필드는 다대다의 관계입니다.우리가 INSTALLED_앱에 auth 앱을 추가하면 Django는 당신이 설치한 앱의 모델(Model)마다 선택할 수 있는 권한 4개를 자동으로 만듭니다.view,add,change,delete.(주: Django 2.0 이전에는 view 권한이 없습니다.그 다음에admin을 통해 이 권한을 다른 사용자에게 분배할 수 있습니다.
    사용자 권한 보기
    권한 이름은 일반적으로 앱 이름(app_label), 권한 동작과 모델 이름으로 구성되어 있습니다.블로그 응용 프로그램의 경우 Django가 Article 모델을 위해 자동으로 생성한 4가지 옵션 권한 이름은 다음과 같습니다.
  • 기사 보기(view): blog.view_article
  • 문장 만들기(add):blog.add_article
  • 변경 글(change): blog.change_article
  • 글 삭제(delete): blog.delete_article
  • 이전 예에서는 Admin을 통해 사용자 A(user_A)에게 글을 작성하고 수정할 수 있는 권한을 할당했습니다.우리는 지금 사용자를 사용할 수 있다.has_perm () 방법으로 사용자가 상응하는 권한을 가지고 있는지 판단합니다.다음 예에서는 True를 반환해야 합니다.
  • user_A.has_perm('blog.add_article')
  • user_A.has_perm('blog.change_article')
  • 사용자가 속한 사용자 그룹의 권한이나 사용자의 모든 권한을 보려면 get_group_permissions() 및 get_all_permissions () 메서드.
  • user_A.get_group_permissions()
  • user_A.get_all_permissions()
  • 권한 수동 정의 및 할당(Permissions
    때때로django가 만든 4가지 선택 권한이 우리의 요구를 충족시키지 못할 때가 있습니다. 사용자 정의 권한이 필요합니다.실현 방법은 주로 두 가지가 있다.다음은 두 가지 방법으로 Article 모델에 두 가지 권한을 추가합니다. 하나는publish_article, 하나는comment_article.
    방법 1.모델의 meta 속성에permissions를 추가합니다.
    
    class Article(models.Model):
      ...
      class Meta:
        permissions = (
          ("publish_article", "Can publish article"),
          ("comment_article", "Can comment article"),
        )
    
    방법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 관리를 사용하면.py migrate 명령을 실행하면 Django admin의 user permissions 표시줄에 선택할 수 있는 권한이 두 개 더 있는 것을 발견할 수 있습니다.
    만약 당신이 항상admin을 통해 사용자에게 권한을 설정하기를 원하지 않는다면, 코드에서 수동으로 사용자에게 권한을 분배할 수도 있습니다.여기에도 두 가지 실현 방법이 있다.
    방법 1.사용자를 사용합니다.user_permissions.add () 메서드
    
    myuser.user_permissions.add(permission1, permission2, ...)
    
    방법user가 있는 사용자 그룹 (group) 을 통해 사용자에게 권한을 추가합니다
    
    mygroup.permissions.add(permission1, permission2, ...)
    
    코드에서 사용자의 권한을 제거하려면remove나clear 방법을 사용할 수 있습니다.
    
    myuser.user_permissions.remove(permission, permission, ...)
    myuser.user_permissions.clear()
    사용 권한 캐시 메커니즘 주의
    Django는 사용 권한 user_를 포함하여 각 사용자 객체를 캐시합니다.permissions.코드에서 사용자의 권한을 수동으로 바꾸면, 사용자의 대상을 다시 가져와야 최신 권한을 얻을 수 있습니다.
    예를 들어 다음 코드에서 사용자에게 수동으로 change_를 추가했습니다blogpost 권한, 사용자를 다시 불러오지 않으면 change_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. 뷰에서 검증
    보기에서 당신은 당연히 사용자를 사용할 수 있습니다.has_perm 방법은 사용자의 권한을 직접 검증합니다.물론 더 좋은 방법은 @permission_required 이 장식기.permission_required(perm, login_url=None, raise_exception=False)하면, 만약, 만약...url, 사용자가 먼저 로그인할 것을 요구합니다.하면, 만약, 만약...exception=True, 403 권한이 없는 오류를 직접 되돌려 줍니다. 로그인 페이지로 넘어가지 않습니다.사용 방법은 다음과 같습니다.
    
    from django.contrib.auth.decorators import permission_required
     
    @permission_required('polls.can_vote')
    def my_view(request):
      ...
    
    함수 뷰가 아닌 클래스 기반 뷰 (Class Based View) 를 사용하는 경우 다음과 같이 PermissionRequiredMixin 클래스를 상속해야 합니다.
    
    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)
    사용자 그룹(Group)과 사용자 모델은 다중 대 다중 관계입니다.그 역할은 권한 제어를 할 때 사용자의 권한을 대량으로 관리하고 분배할 수 있으며, 한 사용자가 분배하지 않아도 작업량을 절약할 수 있다.한 사용자를 한 그룹에 가입하면 이 그룹에 할당된 모든 권한을 갖게 됩니다.예를 들어 사용자 그룹 editors에 권한이 있다면change_article, 그러면 모든 편집기 그룹에 속하는 사용자에게 이 권한이 있습니다.
    사용자 그룹에 사용자를 추가하거나 그룹 (group) 에 권한을 추가하려면 djangoadmin을 통해 직접 진행하는 것을 권장합니다.그룹에 수동으로 권한을 추가하거나 삭제하려면 다음과 같은 방법을 사용할 수 있습니다.
    
    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가 자체적으로 가지고 있는 권한 메커니즘은 모델을 대상으로 하는 것이다. 이것은 사용자가 Article 모델에change의 권한이 있으면 이 사용자는 모든 글의 대상을 수정할 수 있는 권한을 얻는다는 것을 의미한다.만약 우리가 하나의 문장 대상에 대한 권한 관리를 실현하기를 원한다면, 우리는 제3자 라이브러리, 예를 들어djangoguardian을 빌려야 한다.이 라이브러리의 사용에 관해서는 우리 나중에 다시 상세하게 소개하자.
    이 Django 권한 관리(permissions)와 사용자 그룹(group)에 대한 상세한 설명은 여기 있습니다. 더 많은 Django 권한 관리와 사용자 그룹에 대한 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보십시오. 앞으로 많이 지켜봐 주십시오!

    좋은 웹페이지 즐겨찾기