본문 바로가기
AI 웹개발반

[TIL] 장고 permission

by 째깍단 2023. 5. 4.

오늘 한 것

[O] : 백준 통계학 페어프로그래밍

 

[△] : AWS듣기  : 끝까지 듣고싶었는데 다 못들었다.

 

[O] : 후발대 강의 7시 : permission / admin 조정하기

 

 

 


 

 

후발대 강의!

 

> 장고 permission   +이후 공부 더 해서 내용 추가하기

 

 

 

 

장고 rest_framework 내장 기능

뷰가 많아졌을때 하나하나 사용자 유효성 검증 코드를 적어주기는 힘드므로 내장기능이 준비되어있는 것임

이때 사용하는 것이 permission_class

 

 

 

 

- permission 활용

 

이전 과제를 바탕으로 강의가 진행되었다.

Todo는 어떤 사용자가 작성했는지를 알고있다 = Foreignkey로 받고있으므로!

 

if not request.user.is_authenticated:
    # 사용자가 인증된 사용자인지 True or False
    return Response({“message”:’로그인 필요!’})

 

is_anonymous 검증도 가능 (is_authenticated와 반대로 생각하면 된다)

 

 

 

 

 

 

permission class 종류 .. 이외에도 여러 가지가 있다!

  • permissions.AllowAny : 모든 사용자를 대상으로 접근 허용
  • permissions.IsAuthenticated : 로그인 된 사용자를 대상으로 접근 허용
  • permissions.IsAdminUser : admin 사용자를 대상으로 접근 허용
  • permissions.IsAuthenticatedorReadOnly 인증되지 않았으면 읽기만 허용

 

 

#views.py
class ~~View():
	permission_classes = [IsAuthenticated]

 

 

#settings.py
REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly',
    ],

 

여기에서 지정할수도 있다.  “rest_framework.permissions.IsAuthenticated” AllowAny 등

View 설정된 것이 우선순위를 높게 가진다.

 

 

 

 

 

 

 

 

 

 

 

- permission 커스텀 하기

 

 

root 폴더에 permissions.py 만들어서 BasePermision을 상속해서 권한을 수정할 수 있다

 

#기본 class
from rest_framework.permissions import BasePermission

class IsAuthenticated(BasePermission):
    """
    Allows access only to authenticated users.
    """
    def has_permission(self, request, view):
        return bool(request.user and request.user.is_authenticated)

 

 

 

 

아래는 커스텀 permissions 클래스.

요청 유저의 정보를 검증하고 20세 이상의 조건으로 boolean값을 가져와 구분한다.

이외에도 조건은 다양하게 만들어 커스텀 할 수 있다 (ex. 가입일, 나이, VIP, admin계정 등등)

 

#이런식으로 원하는 방법으로 개변하여 사용할 수 있다
class IsAuthenticatedandAdultOnly(BasePermission):
    """
    Allows access only to authenticated users.
    """
	message = “20세 이상만 접근할 수 있습니다”
    def has_permission(self, request, view):
        if bool(request.user and request.user.is_authenticated) and (request.user.age <= “20”):
    return True
else:
    return False

 

 

 

아래는 가입일이 일주일 지나야 접근할 수 있도록 커스텀한 코드.

 

#가입일로 점검 예시
class IsAuthenticatedAndRegistedMoreOneWeek(BasePermission):
    """
    Allows access only to authenticated users.
    """
    message = “가입 후 1주일 지난 사용자만 접근할 수 있습니다”

    def has_permission(self, request, view):
	#join date = 0504
	#target date = 0427
	
    if bool(request.user and request.user.is_authenticated) and (request.user.join_date < timezone.new() - timedelta(days=7)):
        #timezone.now() - 230504
        #timedelta(days=7) 7일 빼겠다
        #timezone.now - timedelta(days=7) 230427
        return True
    else:
        return False

 

 

 

 

 

   def has_permission(self, request, view):
        return bool(
            request.method in SAFE_METHODS or
            request.user and
            request.user.is_authenticated
        )

 

SAFE_METHODS 는 큰 의미는 없고...!!  장고 네이밍임

 

코드를 어떻게 짜느냐에 따라서 가져오는 내용이 달라질 것임.

보통 get 요청에서 쓰이므로 여기에서는 get요청으로 보면 된다...

 

 

 

 

 

 

+ 나머지 내용은 추가

GenericAPIException

 

 

 


 

느낀점 :

 

docs를 열심히 읽자!