Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Django]: Authentication and Permissions #8

Open
ArtemisDicoTiar opened this issue Mar 20, 2021 · 0 comments
Open

[Django]: Authentication and Permissions #8

ArtemisDicoTiar opened this issue Mar 20, 2021 · 0 comments
Labels
Study This issue describes about the topic.

Comments

@ArtemisDicoTiar
Copy link
Owner

Auth and Permission

Adding information to our model

이제 snippet 모델 클래스에 변경사항을 몇개 적용해야한다.

  1. 몇개의 필드를 추가해야한다. 그중 하나는 유저를 보여준다. 다른 필드는 highlighted HTML을 저장하는 데에 쓰인다.
owner = models.ForeignKey('auth.User', related_name='snippets', on_delete=models.CASCADE)
highlighted = models.TextField()

모델에 html 포맷으로 적혀있는 부분이 있다. → 고걸 맞게 수정?

from pygments.lexers import get_lexer_by_name
from pygments.formatters.html import HtmlFormatter
from pygments import highlight

def save(self, *args, **kwargs):
    """
    Use the `pygments` library to create a highlighted HTML
    representation of the code snippet.
    """
    lexer = get_lexer_by_name(self.language)
    linenos = 'table' if self.linenos else False
    options = {'title': self.title} if self.title else {}
    formatter = HtmlFormatter(style=self.style, linenos=linenos,
                              full=True, **options)
    self.highlighted = highlight(self.code, lexer, formatter)
    super(Snippet, self).save(*args, **kwargs)

Adding endpoints for our User models

유저 모델을 생성해서 추가한다.

# serializer.py
from django.contrib.auth.models import User

class UserSerializer(serializers.ModelSerializer):
    snippets = serializers.PrimaryKeyRelatedField(many=True, queryset=Snippet.objects.all())

    class Meta:
        model = User
        fields = ['id', 'username', 'snippets']
# views.py
from django.contrib.auth.models import User
from snippets.serializers import UserSerializer


class UserList(generics.ListAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer


class UserDetail(generics.RetrieveAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
# urls.py
path('users/', views.UserList.as_view()),
path('users/<int:pk>/', views.UserDetail.as_view()),

Associating Snippets with Users

스니펫에 유저정보가 연결되어 있지 않다. 유저정보는 serialised representation 에 전달 되지 않음. 그렇지만 리퀴스트 정보로 들어옴.
이걸 해결하는 방법은 스니펫 views를 " .perform_create() " 를 오버라이드하면 된다
→ 이걸 통해 인스턴스 save관리되는 지를 수정, implicit 하게 들어오는 리퀘스트 혹은 요청된 url을 핸들하게 됨.

스니펫 리스트 view class에 해당 메소드를 추가하면 된다.

def perform_create(self, serializer):
    serializer.save(owner=self.request.user)

시리얼라이저 의 create() 메소드는 이제 새로운 'owner'필드를 passing한다.

Updating our serializer

이제 스니펫 시리얼라이저에 owner 필드를 추가하자.

owner = serializers.ReadOnlyField(source='owner.username')

Adding required permissions to views

이제 스니펫이 유저에 상관되게끔했다. 그래서 이제 승인된 유저만 생성, 업뎃, 삭제할 수 있다.
프레임워크에서 주어진 view에 따라 제한되게할 수 있다.
각 뷰 클래스에 아래 내용을 추가하게 되면 승인된 유저가 아니면 ReadOnly가 적용된다.

from rest_framework import permissions

permission_classes = [permissions.IsAuthenticatedOrReadOnly]

Adding login to the Browsable API

로그인 페이지를 추가하는 방법
urlpattern에 아래 패스를 추가하면 된다.

path('api-auth/', include('rest_framework.urls')),

Object Level Permission

커스텀 퍼미션을 생성해보자

# permissions.py → 새로 생성해야하는 파일이다.
from rest_framework import permissions


class IsOwnerOrReadOnly(permissions.BasePermission):
    """
    Custom permission to only allow owners of an object to edit it.
    """

    def has_object_permission(self, request, view, obj):
        # Read permissions are allowed to any request,
        # so we'll always allow GET, HEAD or OPTIONS requests.
        if request.method in permissions.SAFE_METHODS:
            return True

        # Write permissions are only allowed to the owner of the snippet.
        return obj.owner == request.user

그러고나서 스니펫 view 클래스의 엔드포인트에 permission_classes에 추가하면된다.

@ArtemisDicoTiar ArtemisDicoTiar added the Study This issue describes about the topic. label Mar 20, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Study This issue describes about the topic.
Projects
None yet
Development

No branches or pull requests

1 participant