Django-guardian: 'assign_perm'์„ ์‚ฌ์šฉํ•  ๋•Œ ์ฟผ๋ฆฌ๋ฅผ ์ตœ์ ํ™”ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2020๋…„ 08์›” 20์ผ  ยท  2์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: django-guardian/django-guardian

์ €๋Š” ํ˜„์žฌ ํ•œ ๋ฐฉ์— ์ž์ฒด ๊ทธ๋ฃน ๊ถŒํ•œ์ด ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€ ์ƒˆ ๋ฐฉ์„ ๋งŒ๋“ค๋ฉด ์‹œ์Šคํ…œ์—์„œ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋ฐฉ ๋งŒ๋“ค๊ธฐ
  2. Room Owner#room#{pk} ์™€ ๊ฐ™์€ ๊ณ ์œ ํ•œ ์ด๋ฆ„์œผ๋กœ ์†Œ์œ ์ž ๋ฐ ์ง์› ๊ทธ๋ฃน์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  3. Room ํด๋ž˜์Šค์—์„œ ์†Œ์œ ์ž ๋ฐ ์ง์› ๊ถŒํ•œ ๋ชฉ๋ก ๊ฐ€์ ธ์˜ค๊ธฐ
  4. ๊ฐ ๊ทธ๋ฃน์— ํ• ๋‹นํ•˜๊ธฐ
  5. ์‚ฌ์šฉ์ž์—๊ฒŒ ์†Œ์œ ์ž ๊ทธ๋ฃน ๊ถŒํ•œ ํ• ๋‹น

๋‚ด ๋ฐฉ ๋ชจ๋ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

class Room(models.Model):
    # ...fields

    PERMISSION_GROUPS = [
        'owner': [
            ('view_room', _('...')),
            ('change_room', _('...')),
            ('delete_room', _('...')),

            ('open_room', _('...')),
            ('close_room', _('...'))
        ],
        'staff': [
            ('view_room', _('...')),
            ('open_room', _('...')),
            ('close_room', _('...'))    
        ]
    ]

์ด๊ฒƒ์€ ๋ฐฉ์„ ๋งŒ๋“ค๊ณ  ๊ทธ๋ฃน ๊ถŒํ•œ์„ ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

from guardian.shortcuts import assign_perm

class CreateRoomView(generics.CreateAPIView):
    def _get_permission_string(self, perm):
        """
        Get string permission, the return is like 'room.add_room'
        """
        return f'room.{perm.codename}'

    def post(self):
        # Create a room
        body = {}
        room = Room.objects.create(**body)

        # Get content type
        ctype = ContentType.objects.get_for_model(Room)

        # Define name of owner and staff group for this room permission
        owner_group_name = _('Room Owner#room#{pk}')
        staff_group_name = _('Room Staff#room#{pk}')

        # Create group
        owner_group = Group.objects.create(
            name=owner_group_name.format(pk=room.pk))
        staff_group = Group.objects.create(
            name=staff_group_name.format(pk=room.pk))

        # Get permissions by group permissions
        owner_perms = Permission.objects.filter(
            codename__in=Room.PERMISSION_GROUPS.get('owner'), content_type=ctype)
        staff_perms = Permission.objects.filter(
            codename__in=Room.PERMISSION_GROUPS.get('staff'), content_type=ctype)

        # Assign owner permissions to the group
        for owner_perm in owner_perms:
            perm = self._get_permission_string(owner_perm)
            assign_perm(perm, owner_group, obj=room)

        # Assign staff permissions to the group
        for staff_perm in staff_perms:
            perm = self._get_permission_string(staff_perm)
            assign_perm(perm, staff_group, obj=room)

        # Assign owner group permission to the user
        request.user.groups.add(owner_group)

์ฟผ๋ฆฌ ๋กœ๊ทธ๋ฅผ ๋ณด๋ฉด ์ด ๊ณผ์ •์—์„œ ์ˆ˜ํ–‰๋˜๋Š” ์ฟผ๋ฆฌ๊ฐ€ ๋งŽ๋‹ค.

์‹ค์ œ๋กœ ์œ„์™€ ๊ฐ™์ด ์•„์ง ๋ช‡ ๊ฐœ์˜ ๊ทธ๋ฃน๊ณผ ํ• ๋‹น ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋งŒ ํฌํ•จํ•˜์—ฌ ๋„ˆ๋ฌด ๋งŽ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๊ณ„์‚ฐํ•˜๋ฉด ์ด ํ”„๋กœ์„ธ์Šค์—์„œ ์‹คํ–‰ ๋˜๋Š”

๊ทธ๋ ‡๋‹ค๋ฉด ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ˆ„๊ตฌ๋“ ์ง€ ๋” ์ž˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค,

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

  1. ์ง์ ‘ ์™ธ๋ž˜ ํ‚ค ์‚ฌ์šฉ, https://django-guardian.readthedocs.io/en/stable/userguide/performance.html#direct -foreign-keys ์ฐธ์กฐ

  2. ๋‹น์‹ ์˜ ์ธ์Šคํ„ด์Šค ํ†ต๊ณผ ํ•  ์ˆ˜ Permission ์— assign_perm . perm = self._get_permission_string(owner_perm) ๋Š” ๊ถŒํ•œ๋‹น ์ถ”๊ฐ€ ์ฟผ๋ฆฌ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

  3. ์ด๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ถŒํ•œ์„ ์ผ๊ด„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ํ•˜์ง€๋งŒ ์ด ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„๋‘์„ธ์š”. ์กฐ์ •์ด ํ•„์š”ํ•  ์ˆ˜๋„ ์žˆ๊ณ  ์ „ํ˜€ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.


์ „์—:

# Assign owner permissions to the group
for owner_perm in owner_perms:
    perm = self._get_permission_string(owner_perm)
    assign_perm(perm, owner_group, obj=room)

# Assign staff permissions to the group
for staff_perm in staff_perms:
    perm = self._get_permission_string(staff_perm)
    assign_perm(perm, staff_group, obj=room)

ํ›„์—:

# RoomGroupObjectPermission is the model from suggestion 1, use direct foreign keys
room_group_object_permissions = [
    RoomGroupObjectPermission(
        permission=owner_perm, group=owner_group, content_object=room,
    )
    for owner_perm in owner_perms
] + [
    RoomGroupObjectPermission(
        permission=staff_perm, group=staff_group, content_object=room,
    )
    for staff_perm in staff_perms
]

RoomGroupObjectPermission.objects.bulk_create(room_group_object_permissions)

๋ชจ๋“  2 ๋Œ“๊ธ€

  1. ์ง์ ‘ ์™ธ๋ž˜ ํ‚ค ์‚ฌ์šฉ, https://django-guardian.readthedocs.io/en/stable/userguide/performance.html#direct -foreign-keys ์ฐธ์กฐ

  2. ๋‹น์‹ ์˜ ์ธ์Šคํ„ด์Šค ํ†ต๊ณผ ํ•  ์ˆ˜ Permission ์— assign_perm . perm = self._get_permission_string(owner_perm) ๋Š” ๊ถŒํ•œ๋‹น ์ถ”๊ฐ€ ์ฟผ๋ฆฌ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

  3. ์ด๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ถŒํ•œ์„ ์ผ๊ด„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ํ•˜์ง€๋งŒ ์ด ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„๋‘์„ธ์š”. ์กฐ์ •์ด ํ•„์š”ํ•  ์ˆ˜๋„ ์žˆ๊ณ  ์ „ํ˜€ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.


์ „์—:

# Assign owner permissions to the group
for owner_perm in owner_perms:
    perm = self._get_permission_string(owner_perm)
    assign_perm(perm, owner_group, obj=room)

# Assign staff permissions to the group
for staff_perm in staff_perms:
    perm = self._get_permission_string(staff_perm)
    assign_perm(perm, staff_group, obj=room)

ํ›„์—:

# RoomGroupObjectPermission is the model from suggestion 1, use direct foreign keys
room_group_object_permissions = [
    RoomGroupObjectPermission(
        permission=owner_perm, group=owner_group, content_object=room,
    )
    for owner_perm in owner_perms
] + [
    RoomGroupObjectPermission(
        permission=staff_perm, group=staff_group, content_object=room,
    )
    for staff_perm in staff_perms
]

RoomGroupObjectPermission.objects.bulk_create(room_group_object_permissions)

์–ด๋จธ๋‚˜. ๋‚˜๋Š” ์ด๊ฒƒ์„ ๋†“์ณค๋‹ค. ๋‚˜๋Š” ์ฒซ ๋ฒˆ์งธ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค,

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰