취미삼아 배우는 프로그래밍

DJANGO 권한 그룹 쉽게 만들기.(Setting Group permissions) 본문

파이썬(장고)

DJANGO 권한 그룹 쉽게 만들기.(Setting Group permissions)

Nadure 2020. 3. 30. 12:38

 

장고를 딱 세팅하고 어드민 페이지를 로그인해서 들어가면

위처럼 인증과 권한에 관해 정리해주는 페이지가 있다.

 

그룹은 말 그대로 각 데이터베이스및 각종 권한을 미리 저장해둔 프리셋 이라고 볼 수 있다.

실제 권한을 미리 이렇게 지정해줄 수 있다.

 

하지만 문제는 이를 각각 따로 설정해줘야 한다는 점인데,

보통 으례 개발자 서버환경이 있고, 퍼블리싱하는 서버환경이 따로 존재하고 있는데,

개발자서버에서 각종 권한들을 관리자페이지에서 미리 지정을 해준다 쳐도 퍼블리싱 서버에서 마찬가지 작업을 해야한다.

 

이를 줄여주는 것이 프로그래밍 적으로 해결하는 방법인데

이에관한 스택오버 플로우 답변을 보여주고자 한다.

답변 주소

https://stackoverflow.com/questions/22250352/programmatically-create-a-django-group-with-permissions

 

Programmatically create a django group with permissions

In the Admin console, I can add a group and add a bunch of permissions that relate to my models, e.g. api | project | Can add project api | project | Can change project api | project | Can delete

stackoverflow.com

 

따봉을 가장 많이 받은 것은 첫 번째 대답인데, 그 다음 따봉은 특이하게도 질문이다.

(고놈 참 질문잘했네! 인 느낌)

 

첫 번째 대답은 어떻게보면 가장 원리적인 접근인 것으로 보인다.

from django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType
from api.models import Project
new_group, created = Group.objects.get_or_create(name='new_group')
# Code to add permission to group ???
ct = ContentType.objects.get_for_model(Project)

# Now what - Say I want to add 'Can add project' permission to new_group?
permission = Permission.objects.create(codename='can_add_project',
                                   name='Can add project',
                                   content_type=ct)
new_group.permissions.add(permission)

> 그룹 테이블에 새로운 그룹을 만들고 여기에 permissions 테이블에 존재하는 내용을 들구와서 그룹쪽에다가

추가하는것이다.

 

공홈에 나와있는 방법이기도 하고 가장 정론적인 방법인데, 이것도 어떻게 보면 수작업이다.

 

위의 답변에서 가장 중요하게 봐야할 점은 세 번째 답변인데,

따봉이 가장 적다.

 

그 내용인즉

 

# backend/management/commands/initgroups.py
from django.core.management import BaseCommand
from django.contrib.auth.models import Group, Permission

from backend import models

GROUPS_PERMISSIONS = {
    'ConnectionAdmins': {
        models.StaticCredentials: ['add', 'change', 'delete', 'view'],
        models.NamedCredentials: ['add', 'change', 'delete', 'view'],
        models.Folder: ['add', 'change', 'delete', 'view'],
        models.AppSettings: ['view'],
    },
}

class Command(BaseCommand):
    def __init__(self, *args, **kwargs):
        super(Command, self).__init__(*args, **kwargs)

    help = "Create default groups"

    def handle(self, *args, **options):
        # Loop groups
        for group_name in GROUPS_PERMISSIONS:

            # Get or create group
            group, created = Group.objects.get_or_create(name=group_name)

            # Loop models in group
            for model_cls in GROUPS_PERMISSIONS[group_name]:

                # Loop permissions in group/model
                for perm_index, perm_name in \
                        enumerate(GROUPS_PERMISSIONS[group_name][model_cls]):

                    # Generate permission name as Django would generate it
                    codename = perm_name + "_" + model_cls._meta.model_name

                    try:
                        # Find permission object and add to group
                        perm = Permission.objects.get(codename=codename)
                        group.permissions.add(perm)
                        self.stdout.write("Adding "
                                          + codename
                                          + " to group "
                                          + group.__str__())
                    except Permission.DoesNotExist:
                        self.stdout.write(codename + " not found")

 

앱 폴더 내에 management/commands/initgroups.py로 저장을 하고,

__init__.py를 마찬가지로 생성해주는 것이다.

 

결과부터 말하자면,

사용방법은

python manage.py initgroups 를 통해 위 코드를 실행시켜주는 것이다.

특정 상황에서 원할 시 명령어를 통해 위의 코드를 실행시켜줄 수 있다.

 

그 결과

ConnectionAdmin이라는 그룹이 생기고

이 그룹에는 StaticCredentials, NamedCredentials등의 모델에 관해

add, change, delete, view에 관한 권한을 명시함으로 써 자동적으로 생성하게 도와준다.

 

GROUPS_PERMISSIONS = {
    '관리자(에스폼)': {
        models.OrderModel: ['add', 'change', 'delete', 'view'],
        models.SubOrderModel: ['add', 'change', 'delete', 'view'],
    },
    '관리자(SM)': {
        models.OrderModel: ['view'],
        models.SubOrderModel: ['view'],
    },
}
try:
    for location in ABSTRACT_LOCATIONS:
        GROUPS_PERMISSIONS.update({
            location+'_관리자':{
                models.OrderModel:['add', 'change', 'delete', 'view'],
                models.SubOrderModel: ['add', 'change', 'delete', 'view'],
            }
        })
except Exception as e:
    print(e)
    pass

 

나의 경우엔 GROUPS_PERMISSIONS를 위처럼 설정해줬고

ABSTRACT_LOCATIONS 내에 저장돼있는 ['1호기', '2호기', '3호기', '4호기', '5호기']

에 따라서 그룹을 자동 생성, 권한 자동 지정을 해주는 방식을 했다.

이게 그 결과

 

엄청 깔끔한거 같다.

 

 

Comments