Permission - pai-plznw4me/django-initializer GitHub Wiki
User Login - View - Model
์ด๋ฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด Login ํ User ์ Permission ์ ๋ฐ๋ผ
- view ์ ๊ทผ ์ฌ๋ถ ํ์ธ
- 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'))