[장고] PermissionsMixin 기능과 사용법

소요 시간: 5분

Django는 강력한 권한 관리 시스템을 제공하며, 이를 활용하여 사용자 권한을 세밀하게 제어할 수 있습니다. PermissionsMixin은 Django의 기본 제공 믹스인 클래스 중 하나로, 사용자 모델에 권한 및 그룹 관리 기능을 추가합니다. 이 글에서는 PermissionsMixin을 사용하여 커스텀 사용자 모델을 정의하고, 권한을 관리하는 방법을 설명합니다.


PermissionsMixin이란?

PermissionsMixin은 Django 프레임워크에서 사용자의 권한 관리를 쉽게 할 수 있도록 도와주는 믹스인 클래스입니다. 주로 사용자 모델을 정의할 때 활용되며, 사용자에게 특정 권한을 부여하거나 확인하는 기능을 제공합니다.

주요 기능

  1. 권한 관리: 사용자가 특정 권한을 가지고 있는지 확인할 수 있는 메서드를 제공합니다.
  2. 그룹 관리: 사용자를 여러 권한 그룹으로 분류할 수 있도록 도와줍니다.
  3. 슈퍼유저 기능: 관리자 권한을 가진 사용자를 쉽게 구분할 수 있습니다.

사용 예시

PermissionsMixin은 주로 커스텀 사용자 모델을 정의할 때 사용됩니다. 예를 들어, AbstractUser나 AbstractBaseUser와 함께 사용하여 사용자 모델을 커스터마이징할 수 있습니다.

from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
from django.db import models

class CustomUser(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True)
    name = models.CharField(max_length=100)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['name']

    def __str__(self):
        return self.email

주요 메서드로는, 사용자가 특정 권한을 가지고 있는지 확인하는 has_perm(perm, obj=None), 사용자가 특정 애플리케이션의 권한을 가지고 있는지 확인하는 has_module_perms(app_label), 사용자가 속한 모든 그룹의 권한을 반환하는 get_group_permissions(obj=None), 그리고 사용자가 가지는 모든 권한(그룹 포함)을 반환하는 get_all_permissions(obj=None)이 있습니다.

PermissionsMixin을 활용하면, 뷰나 템플릿에서 사용자가 특정 작업을 수행할 수 있는지 쉽게 확인할 수 있으며, 장고 관리자 페이지에서 권한을 관리하고 사용자에게 특정 권한을 부여할 수 있습니다. 이 믹스인은 Django의 인증 시스템을 확장하고 커스터마이징할 때 매우 유용한 도구로, 이를 통해 사용자의 권한을 보다 세부적으로 관리할 수 있으며, 애플리케이션의 보안성을 높일 수 있습니다.


사용 예시

커스텀 사용자 모델을 통해 사용자 별로 특정 모델에 접근할 수 있는 권한을 부여해보겠습니다.

1. 커스텀 사용자 모델 정의

먼저, 커스텀 사용자 모델을 정의합니다. 여기서는 이메일을 사용자 이름 필드로 사용하는 커스텀 사용자 모델을 정의합니다.

from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin
from django.db import models

class CustomUserManager(BaseUserManager):
    def create_user(self, email, password=None, **extra_fields):
        if not email:
            raise ValueError('The Email field must be set')
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)

        return self.create_user(email, password, **extra_fields)

class CustomUser(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True)
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    objects = CustomUserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['first_name', 'last_name']

    def __str__(self):
        return self.email

2. 설정 파일 수정

settings.py 파일에서 기본 사용자 모델을 커스텀 사용자 모델로 변경합니다.

# settings.py
AUTH_USER_MODEL = 'myapp.CustomUser'

3. 권한 정의 및 부여

모델에 권한을 정의하고, 사용자에게 권한을 부여하는 방법을 살펴보겠습니다.

3.1 권한 정의

권한을 모델의 메타 클래스에 정의합니다.

from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()

    class Meta:
        permissions = [
            ("can_publish", "Can publish articles"),
            ("can_edit", "Can edit articles"),
        ]

3.2 사용자에게 권한 부여

코드를 통해 사용자에게 권한을 부여하는 예시입니다.

from django.contrib.auth import get_user_model
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
from myapp.models import Article

# 커스텀 사용자 모델 가져오기
CustomUser = get_user_model()

# 사용자 생성
user = CustomUser.objects.create_user(email='user@example.com', password='password', first_name='First', last_name='Last')

# 권한 가져오기
content_type = ContentType.objects.get_for_model(Article)
permission = Permission.objects.get(codename='can_publish', content_type=content_type)

# 사용자에게 권한 부여
user.user_permissions.add(permission)

3.3 그룹을 통해 권한 부여

그룹을 만들어 권한을 부여하고, 사용자를 그룹에 추가하는 예시입니다.

from django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType
from myapp.models import Article

# 그룹 생성
group, created = Group.objects.get_or_create(name='Editors')

# 권한 가져오기
content_type = ContentType.objects.get_for_model(Article)
permission = Permission.objects.get(codename='can_edit', content_type=content_type)

# 그룹에 권한 추가
group.permissions.add(permission)

# 사용자 생성 및 그룹 할당
user = CustomUser.objects.create_user(email='editor@example.com', password='password', first_name='Editor', last_name='User')
user.groups.add(group)

4. 권한 확인

사용자가 특정 권한을 가지고 있는지 확인합니다.

# 특정 권한 확인
if user.has_perm('myapp.can_publish'):
    print("사용자는 게시 권한이 있습니다.")

# 여러 권한 확인
if user.has_perms(['myapp.can_publish', 'myapp.can_edit']):
    print("사용자는 게시 및 편집 권한이 있습니다.")

요약

위 예시들은 Django에서 커스텀 사용자 모델을 사용하여 권한을 부여하는 다양한 방법을 보여줍니다. 권한을 직접 사용자에게 할당하거나 그룹을 통해 일괄적으로 할당할 수 있으며, 권한이 제대로 부여되었는지 확인할 수도 있습니다. 이를 통해 애플리케이션의 권한 관리를 효과적으로 수행할 수 있습니다.

장고 리스트