Django-guardian: django 1.7 ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์—์„œ assign_perm ์‚ฌ์šฉ

์— ๋งŒ๋“  2014๋…„ 11์›” 13์ผ  ยท  10์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: django-guardian/django-guardian

๋‹ค์Œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ฝ”๋“œ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

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)

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

๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ ์œ ์šฉํ•œ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ์—ฌ๊ธฐ์— ๊ฒŒ์‹œํ•˜๊ณ  ์žˆ์ง€๋งŒ ์ดˆ๊ธฐ ์„ค์ • ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์œ„ํ•ด ๋น„๊ต์  ์ผ๋ฐ˜์ ์ธ 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
        }
    )

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

+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
        }
    )
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰

๊ด€๋ จ ๋ฌธ์ œ

Allan-Nava picture Allan-Nava  ยท  4์ฝ”๋ฉ˜ํŠธ

brianmay picture brianmay  ยท  16์ฝ”๋ฉ˜ํŠธ

BenDevelopment picture BenDevelopment  ยท  5์ฝ”๋ฉ˜ํŠธ

ad-m picture ad-m  ยท  13์ฝ”๋ฉ˜ํŠธ

David-OConnor picture David-OConnor  ยท  6์ฝ”๋ฉ˜ํŠธ