๋ค์ ๋ง์ด๊ทธ๋ ์ด์ ์ฝ๋๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
from django.db import models, migrations
from guardian.shortcuts import assign_perm
def assign_perms(apps, schema_editor):
Group = apps.get_model("auth", "Group")
for group in Group.objects.all():
assign_perm('products.view_product', group)
# assign_perm('products.view_product', group, product)
class Migration(migrations.Migration):
operations = [
migrations.RunPython(assign_perms),
]
์ด ๋ง์ด๊ทธ๋ ์ด์
์ ์ ์ฉํ ๋ assign_perm
ํธ์ถ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
guardian.exceptions.NotUserNorGroup: User/AnonymousUser or Group instance is required (got Group object)
+1
+1
+1
๋๋ ๊ฐ์ ธ์์ด ์ค๋ฅ๋ฅผ ์์ Group
์์ django.contrib.auth
๊ทธ๋ฌ๋ ์ง๊ธ (# 333 ์ฐธ์กฐ) ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ชจ๋ ๋ณ๊ฒฝ์ํ์ง ์๋ ๊ฒ. ๊ทธ๊ฒ์ django 1.8 ๋ฐ Guardian 1.3์ ์์ง๋ง ๋๊ตฐ๊ฐ๊ฐ 1.7์์ ์๋ํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์
๋๋ค.
๋ง์ด๊ทธ๋ ์ด์
์คํฌ๋ฆฝํธ์ ๋ ๊ฐ์ง ๋์ฐ๋ฏธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ฒ ๋์์ต๋๋ค.
https://gist.github.com/xuhcc/67871719116bdc0fee6c
(django-guardian==1.2.5)
๋ถํํ๋ 1.8/1.3์๋ ์ฌ์ ํ ์ฌ๋์ด ์์ต๋๋ค. ๋์ฐ๋ฏธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
ValueError: Cannot query "project": Must be "ContentType" instance
perm = Permission.objects.get(
content_type=get_content_type(obj),
codename=codename)
obj
๋ ๋ค์๊ณผ ๊ฐ์ด ์ป์ ํ๋ก์ ํธ๋ผ๋ ๋ชจ๋ธ์ ์ธ์คํด์ค์
๋๋ค.
projs = get_objects_for_user(user, 'api.view_project')
for proj in projs:
assign_perm(apps, 'api.edit_project', user, proj)
๋ถํํ๋ ๋ง์ด๊ทธ๋ ์ด์ ๋ด๋ถ์์ assign_perms๋ฅผ ์ฌ์ฉํ๋ ๊ฒ(๋๋ ๋ง์ด๊ทธ๋ ์ด์ ์์ฒด์ ์๋ ๋ค๋ฅธ ์คํค๋ง ์ข ์ ์ฝ๋)์ ์ ๋ง ๋์ ์๊ฐ์ ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ์๋ํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ผ์ง ์์ต๋๋ค.
์๋ํ์ง ์๋ ์ด์ ๋ ๊ถํ ๋ชจ๋ธ์ ์ฐพ๋ ๋
ผ๋ฆฌ์์ ๋ง์ด๊ทธ๋ ์ด์
์ ํ์ํ apps.get_model()
๋ฐํ๋ ์ฌ๋ฐ๋ฅธ ๋ชจ๋ธ์ ์ฌ์ฉํ์ง ์์ ๊ฐ๋ฅ์ฑ์ด ๊ฐ์ฅ ๋์ต๋๋ค. ์ด๊ฒ์ ๊ณ ์น ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ฌ๊ธฐ์๋ ํด๊ฒฐํ ์ ์๋ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ฆ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ง์ด๊ทธ๋ ์ด์
์ assign_perm()
ํจ์ ๋๋ assign_perm()
ํธ์ถ์ ์ง๋ ฌํํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ์ดํ ๋ฒ์ ์ django-guardian์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ ์คํค๋ง๋ฅผ ์ฌ์ฉํ๋๋ก assign_perm()
๋ฅผ ์
๋ฐ์ดํธํ ์ ์์ต๋๋ค. ์ด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ก ์ assign_perm()
์ฝ๋๋ฅผ ์คํํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ด์ ๋ง์ด๊ทธ๋ ์ด์
์ด ๊ฐ์๊ธฐ ์ค๋จ๋ฉ๋๋ค.
์ค์ ๋ก ์ญํ ๊ณผ ๊ฐ์ด ์์ฒญ๋ ์ผ๋ถ ๊ธฐ๋ฅ์ ์คํค๋ง์์ ์ด๋ฌํ ๋ณ๊ฒฝ์ ์๊ตฌํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ์๋ง๋ ๋น์ ์ด ์ฐพ๊ณ ์๋ ๋๋ต์ด ์๋ ์ ์์ง๋ง ๊ถํ์ ์ค์ ํ๋ ค๋ฉด ๋ ๋ฎ์ ์์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ ์ฌ์ฉํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ฒ์ Permission db ๋ชจ๋ธ๊ณผ์ ์ง์ ์ ์ธ ์ํธ ์์ฉ์ ์๋ฏธํฉ๋๋ค. Django ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ง์ด๊ทธ๋ ์ด์ ์ธ๋ถ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ์ข ์ ๊ธฐ๋ฅ์ ์ก์ธ์คํด์๋ ์ ๋ฉ๋๋ค. ์ฌ๊ธฐ์๋ db ๋ชจ๋ธ ํด๋์ค์ ์ฌ์ฉ์ ์ง์ ํจ์๋ ํฌํจ๋ฉ๋๋ค.
์๋ง๋ ์ด ์ ํ ์ฌํญ์ ๋ ์ ๋ฌธ์ํ๋ ์ ์์ต๋๋ค. ํ ๋ฆฌํ์คํธ ๊ฐ์ฌํฉ๋๋ค.
์ด ๋ฒ๊ทธ๋ฅผ ๋ซ์ต๋๋ค.
์๋
ํ์ญ๋๊น
1.4.4 ๋ฒ์ pf Guardian ๋ฐ django 1.9.7๊ณผ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๋ง์ด๊ทธ๋ ์ด์
๋ด๋ถ์ ๋ชจ๋ assign_perm์ด ์๋ํ์ง ์์ต๋๋ค... :(
๋ง์ด๊ทธ๋ ์ด์
๋ด๋ถ์์ ์์ ํ ์์ ๋๊ฑฐ๋ ์์ญ์ด ํจ์น๊ฐ ์ด๋ป๊ฒ ๋ ์ ์๋์ง ์์ญ๋๊น?
์๋ํ์ง ์๋ ์ด์ ๋ ๊ถํ ๋ชจ๋ธ์ ์ฐพ๋ ๋ ผ๋ฆฌ์์ ๋ง์ด๊ทธ๋ ์ด์ ์ ํ์ํ apps.get_model()์ด ๋ฐํํ๋ ์ฌ๋ฐ๋ฅธ ๋ชจ๋ธ์ ์ฌ์ฉํ์ง ์์ ๊ฐ๋ฅ์ฑ์ด ๊ฐ์ฅ ๋์ต๋๋ค. ์ด๊ฒ์ ๊ณ ์น ์ ์์ต๋๋ค.
์ธ์ฆ ๊ทธ๋ฃน์ด ๊ฐ๋์ธ ๊ทธ๋ฃน์ฒ๋ผ ์๋ํ๋๋ก ๋ํ๋ ์ ์์ต๋๋ค.
๋ค๋ฅธ ์ฌ๋์๊ฒ ์ ์ฉํ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ ์ฌ๊ธฐ์ ๊ฒ์ํ๊ณ ์์ง๋ง ์ด๊ธฐ ์ค์ ๋ง์ด๊ทธ๋ ์ด์
์ ์ํด ๋น๊ต์ ์ผ๋ฐ์ ์ธ assign_perm
๋ฐฉ๋ฒ์ ์์ฑํ์ผ๋ฉฐ ๋ช ๊ฐ์ง ๊ฐ์ ์ ํ์ง๋ง ์๋ง๋ ๋์์ด ๋ ๊ฒ์
๋๋ค.
def assign_perm(perm, user_or_group, obj=None, apps=None):
permission_model = apps.get_model('auth', 'Permission')
permission = permission_model.objects.get(codename=perm)
# Assumes object permission models live in the same app as the model they govern
# and are named like `ProjectUserObjectPermission`/`ProjectGroupObjectPermission`
obj_permission_model = apps.get_model(obj._meta.app_label, '{}{}ObjectPermission'.format(
obj._meta.object_name,
user_or_group._meta.object_name,
))
obj_permission_model.objects.create(
# `object_pk` and `content_type_id` keys if you're not using direct foreign keys
# https://django-guardian.readthedocs.io/en/stable/userguide/performance.html#direct-foreign-keys
content_object=obj,
permission=permission,
**{
user_or_group._meta.model_name: user_or_group
}
)
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ค๋ฅธ ์ฌ๋์๊ฒ ์ ์ฉํ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ ์ฌ๊ธฐ์ ๊ฒ์ํ๊ณ ์์ง๋ง ์ด๊ธฐ ์ค์ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ํด ๋น๊ต์ ์ผ๋ฐ์ ์ธ
assign_perm
๋ฐฉ๋ฒ์ ์์ฑํ์ผ๋ฉฐ ๋ช ๊ฐ์ง ๊ฐ์ ์ ํ์ง๋ง ์๋ง๋ ๋์์ด ๋ ๊ฒ์ ๋๋ค.