์ ๋ ํ์ฌ ํ ๋ฐฉ์ ์์ฒด ๊ทธ๋ฃน ๊ถํ์ด ์๋ ํ๋ก์ ํธ๋ฅผ ์งํ ์ค์ ๋๋ค.
๋๊ตฐ๊ฐ ์ ๋ฐฉ์ ๋ง๋ค๋ฉด ์์คํ ์์ ๋ค์์ ์ํํฉ๋๋ค.
Room Owner#room#{pk}
์ ๊ฐ์ ๊ณ ์ ํ ์ด๋ฆ์ผ๋ก ์์ ์ ๋ฐ ์ง์ ๊ทธ๋ฃน์ ๋ง๋ญ๋๋ค.๋ด ๋ฐฉ ๋ชจ๋ธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
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)
์ฟผ๋ฆฌ ๋ก๊ทธ๋ฅผ ๋ณด๋ฉด ์ด ๊ณผ์ ์์ ์ํ๋๋ ์ฟผ๋ฆฌ๊ฐ ๋ง๋ค.
์ค์ ๋ก ์์ ๊ฐ์ด ์์ง ๋ช ๊ฐ์ ๊ทธ๋ฃน๊ณผ ํ ๋น ํ๋ก์ธ์ค๊ฐ ์์ง๋ง ๋ช ๊ฐ์ง ์๋ง ํฌํจํ์ฌ ๋๋ฌด ๋ง์ง๋ ์์ต๋๋ค. ๊ณ์ฐํ๋ฉด ์ด ํ๋ก์ธ์ค์์ ์คํ ๋๋
๊ทธ๋ ๋ค๋ฉด ์ด ๋ฌธ์ ์ ๋ํ ์ฟผ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ์ต์ ํํ ์ ์์ต๋๊น? ๋๊ตฌ๋ ์ง ๋ ์ํ๋ ๋ฐฉ๋ฒ์ ๊ณต์ ํ ์ ์์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค,
์ง์ ์ธ๋ ํค ์ฌ์ฉ, https://django-guardian.readthedocs.io/en/stable/userguide/performance.html#direct -foreign-keys ์ฐธ์กฐ
๋น์ ์ ์ธ์คํด์ค ํต๊ณผ ํ ์ Permission
์ assign_perm
. perm = self._get_permission_string(owner_perm)
๋ ๊ถํ๋น ์ถ๊ฐ ์ฟผ๋ฆฌ๋ก ์ด์ด์ง๋๋ค.
์ด๊ฒ์ผ๋ก ์ถฉ๋ถํ์ง ์์ผ๋ฉด ๊ถํ์ ์ผ๊ด ํ ๋นํ ์ ์์ต๋๋ค. ์๋ ์ฝ๋๋ฅผ ์ฐธ์กฐํ์ธ์. ํ์ง๋ง ์ด ์ฝ๋๋ฅผ ํ ์คํธํ์ง ์์๋ค๋ ๊ฒ์ ์์๋์ธ์. ์กฐ์ ์ด ํ์ํ ์๋ ์๊ณ ์ ํ ์๋ํ์ง ์์ ์๋ ์์ต๋๋ค.
์ ์:
# 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)
์ด๋จธ๋. ๋๋ ์ด๊ฒ์ ๋์ณค๋ค. ๋๋ ์ฒซ ๋ฒ์งธ ๊ฒ์ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค. ๊ฐ์ฌํฉ๋๋ค,
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ง์ ์ธ๋ ํค ์ฌ์ฉ, https://django-guardian.readthedocs.io/en/stable/userguide/performance.html#direct -foreign-keys ์ฐธ์กฐ
๋น์ ์ ์ธ์คํด์ค ํต๊ณผ ํ ์
Permission
์assign_perm
.perm = self._get_permission_string(owner_perm)
๋ ๊ถํ๋น ์ถ๊ฐ ์ฟผ๋ฆฌ๋ก ์ด์ด์ง๋๋ค.์ด๊ฒ์ผ๋ก ์ถฉ๋ถํ์ง ์์ผ๋ฉด ๊ถํ์ ์ผ๊ด ํ ๋นํ ์ ์์ต๋๋ค. ์๋ ์ฝ๋๋ฅผ ์ฐธ์กฐํ์ธ์. ํ์ง๋ง ์ด ์ฝ๋๋ฅผ ํ ์คํธํ์ง ์์๋ค๋ ๊ฒ์ ์์๋์ธ์. ์กฐ์ ์ด ํ์ํ ์๋ ์๊ณ ์ ํ ์๋ํ์ง ์์ ์๋ ์์ต๋๋ค.
์ ์:
ํ์: