Permission - pai-plznw4me/django-initializer GitHub Wiki

User Login - View - Model

์ด๋Ÿฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด Login ํ•œ User ์˜ Permission ์— ๋”ฐ๋ผ

  1. view ์ ‘๊ทผ ์—ฌ๋ถ€ ํ™•์ธ
  2. Model ์ ‘๊ทผ ์—ฌ๋ถ€ ์ง€์ • ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

Django ์˜ ๊ธฐ๋ณธ Permission ๊ตฌ์กฐ๋Š” Model์— ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ์‹œ์Šคํ…œ์ด๋‹ค.
๊ถŒํ•œ์„ ๋ถ€์—ฌํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์šฐ์„ ์ ์œผ๋กœ ํ•ด๋‹น Authentication ์ด ์žˆ๋Š”์ง€ ์•„๋‹Œ์ง€ ์—ฌ๋ถ€์™€
Authentication ์ด ์žˆ๋‹ค๋ฉด Authorization ์ด Create ์—ฌ๋ถ€ , Read ์—ฌ๋ถ€ , Write ์—ฌ๋ถ€, Delete ์—ฌ๋ถ€ ์„ ๊ฐ€์งˆ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์œ ์ € ๋˜๋Š” ๊ทธ๋ฃน์ด ํ•ด๋‹น ๊ถŒํ•œ์„ ๋ฐ›๋Š” ๊ตฌ์กฐ์ด๋‹ค.
(โš ๏ธ ์Šˆํผ์œ ์ €๋Š” ๋ชจ๋“  ๊ถŒํ•œ์„ ๋‹ค ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ์Šˆํผ์œ ์ €์˜ ๊ถŒํ•œ์„ ๋ฐ•ํƒˆํ•  ์ˆ˜ ์—†๋‹ค.)
๊ทธ๋ฆฌ๊ณ  view function ์—์„œ๋Š” ์œ ์ €๊ฐ€ ๋ชจ๋ธ์— ์ ‘๊ทผ ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ์•„๋‹Œ์ง€, (์ฆ‰ ๊ฐ ๋ชจ๋ธ๋ณ„๋กœ ์„ค์ •ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ์•„๋‹Œ์ง€)๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์‹ค๋ก€๋กœ ์•„๋ž˜ ์Šค์ƒท์€ admin page ์— group ์ƒ์„ฑ page ์ธ๋ฐ group ์ƒ์„ฑ์‹œ ์–ด๋–ค ๊ถŒํ•œ์„ ์ค„์ง€ ๋ณด์—ฌ์ค„ ๋•Œ ๊ฐ app ๋ณ„ ๋ชจ๋ธ์˜ CRUD ๋กœ ๊ถŒํ•œ์„ ์ฃผ๋Š”๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Step 1. ๋ชจ๋ธ

Meta Class ์— ๊ถŒํ™˜(permission) ๊ด€๋ จ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
permissions ๋ณ€์ˆ˜์— tuple ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.
tuple ์ •๋ณด

  • (๊ธฐ๋ก๋  ๊ถŒํ•œ ์ด๋ฆ„, ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์งˆ ๊ถŒํ•œ ์ด๋ฆ„)
class GoldUser(models.Model):
    validate_date = models.DateField()

    class Meta:

        permissions = [('gold_member ',  # ๊ธฐ๋ก๋  ๊ถŒํ•œ ์ด๋ฆ„  
                        'Gold member')]  # ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์งˆ ๊ถŒํ•œ ์ด๋ฆ„

Step 2. ๋ทฐ / URLConf ์ž‘์„ฑ

2.1 ๊ถŒํ•œ ์†Œ์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ฅธ ์ ‘๊ทผ ํ—ˆ์šฉ

permission_required ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ถŒํ•œ ์†Œ์ง€ ๋œ ์œ ์ €์— ํ•œ์— ํ•ด๋‹น ์‚ฌ์ดํŠธ๋ฅผ ์ ‘๊ทผํ•˜๊ฒŒ ํ•œ๋‹ค.
decorator ์„ ํ†ตํ•ด ๊ฐ ๋ทฐ์— ์‰ฝ๊ฒŒ ์ ์šฉ ๊ฐ€๋Šฅ ํ•˜๋‹ค

# accounts/views.py

@login_required
@permission_required('accounts.gold_member', login_url=reverse_lazy('accounts:gold_member_guide')) 
def only_gold(request):
    return HttpResponse('Welcome gold member(ํ˜ธ๊ฐฑ) ')

# gold ํšŒ์›์ด ์•„๋‹ˆ ํšŒ์›์ด ๋ณด๊ฒŒ๋  ๋ทฐ
def gold_member_guide(request):
    return HttpResponse('Gold ํšŒ์›์ด ๋˜๋ฉด ์ข‹์€์ . 1. ๊ฝ์งœ ์ปคํ”ผ ')

# # accounts/urls.py
urlpatterns = [
 ...
 path('only_gold', only_gold, name='only_gold'),
     path('gold_member_guide', gold_member_guide, name='gold_member_guide'),
]

Step 3. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

python manage.py makemirations
python manage.py migrate

Step 4. ๊ถŒํ•œ ๋ถ€์—ฌ ๋ฐ ์‚ญ์ œ

4.1 ๊ถŒํ•œ ๋ถ€์—ฌ

model = GoldUser  # ๊ถŒํ•œ(permission) ์„ ์ •์˜ํ•œ ๋ชจ๋ธ
content_type = ContentType.objects.get_for_model(model) 
perm = Permission.objects.get(codename='gold_member', content_type=content_type)  #  ๊ถŒํ•œ(permission) ๊ฐ์ฒด๋ฅผ ์–ป์–ด ์˜ต๋‹ˆ๋‹ค.# user ์—๊ฒŒ permission ์„ ์ ์šฉํ•œ๋‹ค. 
user.user_permissions.add(perm)  # ๊ถŒํ•œ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. 

4.2 ๊ถŒํ•œ ์ œ๊ฑฐ

model = GoldUser  # ๊ถŒํ•œ(permission) ์„ ์ •์˜ํ•œ ๋ชจ๋ธ
content_type = ContentType.objects.get_for_model(model) 
perm = Permission.objects.get(codename='gold_member', content_type=content_type)  #  ๊ถŒํ•œ(permission) ๊ฐ์ฒด๋ฅผ ์–ป์–ด ์˜ต๋‹ˆ๋‹ค.
# user ์—๊ฒŒ permission ์„ ์ ์šฉํ•œ๋‹ค. 
request.user.user_permissions.remove(perm)

Step 5. ๊ถŒํ•œ ํ™•์ธํ•˜๊ธฐ

print(user.has_perm('accounts.payment_complete'))

Reference