django의 로그인 기능에 대해서 2021/2/18

10413 단어 장고

1. 인증(Authentication)과 승인(Authorization)의 차이에 대해



인증 ( Authentication )



서비스에 액세스 한 사용자가 「本人であるかどうか」를 확인합니다.



승인 (Authorization)



서비스에 액세스한 인증된 사용자가 「指定した リソース へ アクセスできるかどうか」를 제어합니다.



django의 account를 인증되지 않으면 실행할 수 없는 api로 한다(authorization)



viewsets.py
class AccountViewSet(viewsets.ModelViewSet):
    queryset = Account.objects.all()
    serializer_class = AccountSerializer
    permission_classes = [permissions.AllowAny]

permission_classes 라는 필드가 등장했습니다만, Django REST framework 에서는 여기에 Permission 클래스를 설정하는 것으로 액세스권을 설정하도록(듯이) 한다. (여기서 누구나 액세스할 수 있음)


viewsets.py
class AccountViewSet(viewsets.ModelViewSet):
    queryset = Account.objects.all()
    serializer_class = AccountSerializer
    permission_classes = [permissions.IsAuthenticated]

permission_classes에 IsAuthenticated를 지정했습니다. 이것으로 인증이 끝나지 않으면 실행할 수 없는 API로 할 수 있었다.

그러면 ,,



이제 무사히 보안 레벨을 올릴 수 있었습니다!

여기에서는 액세스하기 위해서는 token을 등록할 필요가 있지만 그 Authenticate의 설정 방법은 setting.py 로 관리할 수 있다.

setting.py
REST_FRAMEWORK = {
    # Use Django's standard `django.contrib.auth` permissions,
    # or allow read-only access for unauthenticated users.
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
    ],
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication'
    ]
}

여기에서는 토큰으로 액세스 할 수 있도록하고 싶기 때문에 'rest_framework.authentication.TokenAuthentication'를 추가했다.

토큰 작성 및 취득 방법



1. 사용자 얻기

터미널
account = Account.objects.filter(id=14).first()
<output> < Account: 14>

account.user
<output> <User: 'ユーザー名'>


2.Token을 작성·취득한다

토큰을 만드는 방법

터미널
from rest_framework.authtoken.models import Token

token = Token.objects.create(user=...)
 #取得の時はcreate→getに変える
print(token.key)

자세한 내용은 django rest framework 문서를 참조하십시오.
htps //w w. d 짱 고레 st-f 라메를 rk. 오 rg / 아피 구이 / 아우테 펜치 카치 온 /

get_queryset 함수



AuthToken으로 보안을 올렸지만, 이대로라면 토큰을 취득해 한 번 로그인해 버리면 어느 Account의 정보도 취득할 수 버리므로 get_queryset 함수를 오버라이드(override) 한다

get_queryset이란?

get_queryset 메서드는 주로 ListView에서 사용되지만 모델 인스턴스 목록을 반환하는 메서드입니다. 예를 들어 filter 메소드로 좁히거나 유연하게 목록을 얻고 싶다면 get_queryset 메소드를 덮어 쓰고 그렇게 작성하십시오.


viewsets.py
class AccountViewSet(viewsets.ModelViewSet):
    queryset = Account.objects.all()
    serializer_class = AccountSerializer
    # permission_classes = [permissions.IsAuthenticated]

    def get_queryset(self):
        queryset = self.queryset.filter(user=self.request.user)
        return queryset  

쿼리 세트 얻기 get_queryset 재정의

to_representation 함수



하고 싶은 일



Account 모델의 필드에 토큰을 추가하고 싶습니다.

serializers
 def to_representation(self, value)
    output = super().to_representation(value)
    print(output) 
      #ターミナル上で確認する
    return output
    #ポストマンで確認する



output의 사전 형식에 token이라는 키 추가

위의 코드로 표시된 value는 account 객체의 내용과 같기 때문에 그 안에 토큰의 key와 value를 추가한다
우선, value 오브젝트의 형태를 확인하기 위해서print(type(value)) 사용하기

type()이란 객체의 형태를 취득, 확인

print(type('string'))



serializars.py
    def to_representation(self, account):
        print("hogehoge", type(account))
        output = super().to_representation(account)
        token = Token.objects.filter(user=account.user).first()
        if not token:
            token = Token.objects.create(user=account.user)
        output['token'] = token.key
        print(output)
        return output


Django REST Framework : 하나의 APIView에서 요청 메소드마다 permission_classes를 분리합니다.



하고 싶은 일



POST시 IsAuthentication을 제거하고 싶습니다. 왜냐하면 계정이 없을 때 토큰을 만들 수 없기 때문입니다.

viewsets.py
    def get_permissions(self):
        if self.request.method == 'POST':
            return []
        else:
            return [permissions.IsAuthenticated()]

이렇게 함으로써, post 메소드의 때는 퍼미션이 필요없고, get 메소드등의 때는 IsAuthenticated를 퍼미션으로서 채용할 수 있다.

좋은 웹페이지 즐겨찾기