반응형
특정 User나 Group에 대해서 권한을 설정하고, Admin 페이지에서 권한별 UI를 띄워서 관리하기 위해 고려해 볼 수 있는 사항으로 Model Meta에 permissions를 설정하여 권한을 관리할 수 있다.
간단한 예시로, 유튜브를 보면 프리미엄에 가입한 유저는 광고가 뜨지않고, 그렇지 않은 유저는 광고가 뜨도록 설정하는 것도 권한과 관련이 있다.
django에서 모델 메타 설정을 통해 권한을 관리하는 방법에 대한 내용이다.
Django의 Meta 설정이란?
permission 기능을 구현하기에 앞서 Django의 Meta 기능에 대해서 간략히 설명하자면, 모델의 동작을 커스터마이징하기 위해 사용되는 기능으로 데이터베이스의 테이블 명, 정렬 순서, 권한 등 다양한 설정을 포함할 수 있는 클래스이다.
아래의 예시 코드에서 Class Meta 부분에서 정의 해주면 된다.
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
class Meta: <- 이거
permission 설정
아래에서 부터는 앞서 예시로 보여줬던 Post 모델에 Meta 클래스를 바탕으로 권한 정의, 부여 그리고 검사하는 방법에 대해서 이다.
권한 정의
class BlogPost(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
class Meta:
permissions = [
("view_premium_post", "프리미엄 컨텐츠를 볼 수 있음"),
]
이제 마이그레이션 파일을 만들고 데이터 베이스에 적용한다.
권한 할당
특정 사용자에게 view_premium_post 권한을 할당하기 위해서 아래 예시처럼 진행하면 된다.
from django.contrib.auth.models import User
user = User.objects.get(username='username')
user.user_permissions.add('blog.view_premium_post')
권한 검사
아래처럼 url, view을 구성함으로써, 로그인 여부와, view_premium_post 권한을 확인하고 권한이 있으면 post_premium_detail 메서드로 이동하고 없으면 login_url을 타고 premium_user_guide로 넘어가게 되는 것이다.
# urls.py
urlpatterns = [
path("premium-user-guide/", views.premium_user_guide, name="premium_user_guide"),
path("premium/<str:slug>/", views.post_premium_detail, name="post_premium_detail"),
]
# views.py
from django.contrib.auth.decorators import login_required, permission_required
@login_required
@permission_required("blog.view_premium_post", login_url="blog:premium_user_guide")
def post_premium_detail(request, slug):
return HttpResponse(f"프리미엄 컨텐츠 페이지 : {slug}")
def premium_user_guide(request):
return HttpResponse("프리미엄 유저 가이드 페이지")
반응형
'BackEnd > Django, DRF' 카테고리의 다른 글
[DRF] nested serializer 사용 방법 (0) | 2024.07.03 |
---|---|
[Django] admin.ModelAdmin 메서드 정리 (0) | 2024.07.03 |
[Django] Bulk Operations에 대해서 (0) | 2024.07.03 |
[Django] 모델 기본 필드 이해하기 (1) | 2024.06.18 |
[Django] Generic date views (Archive views) (0) | 2024.06.18 |