iT邦幫忙

0

[DAY3] Django與Docker Compose後端開發實戰 - JWT認證與使用者管理

  • 分享至 

  • xImage
  •  

在上一篇技術教學文章中,我們已經介紹了如何在Django項目中整合MariaDB和Redis。MariaDB替代了預設的SQLite3數據庫,提供了更強大的數據處理能力和高並發支持,而Redis則作為高性能的鍵值對數據庫,實現了快速的數據緩存。

[DAY2] Django與Docker Compose後端開發實戰 - MariaDB與Redis整合與應用

今天,我們將進一步深入,探討如何在Django項目中實現JWT(JSON Web Token)認證系統,並介紹如何管理使用者。JWT是一種輕量級的認證機制,廣泛應用於現代Web應用中,提供安全的身份驗證和信息交換,它通過生成加密的token來驗證用戶身份,每次用戶請求時,服務端都會檢查這個token的合法性。JWT的優點在於它無需在服務端存儲會話數據,所有必要的信息都包含在token中,這使得其具有高效和擴展性強的特點。我們將手把手教學,從創建認證App開始,到設置JWT和使用者管理,讓您的Django項目更加完善和安全。

創建JWT和使用

創建認證App

首先,我們需要創建一個用來認證的App,命名為account

docker exec -it backend-api-services python3 manage.py startapp account

更新設置文件

接下來,更新backend/settings.py文件,添加account到已安裝的應用程序列表中,並配置JWT認證:

from datetime import timedelta

INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "account",
]

# JWT
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ),
}

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
}

更新URL配置

backend/urls.py中,包含account的URL配置:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path("admin/", admin.site.urls),
    path('account/', include('account.urls')),
]

創建視圖

account/views.py中,創建用戶和JWT的視圖:

from rest_framework import generics
from rest_framework_simplejwt.views import TokenObtainPairView
from .models import UserProfile
from .serializers import UserSerializer

class CreateUserView(generics.CreateAPIView):
    queryset = UserProfile.objects.all()
    serializer_class = UserSerializer

class MyTokenObtainPairView(TokenObtainPairView):
    pass

創建應用層級URL和序列化器

account目錄下創建urls.py文件:

from django.urls import path
from .views import CreateUserView, MyTokenObtainPairView

urlpatterns = [
    path('create/', CreateUserView.as_view(), name='create_user'),
    path('token/', MyTokenObtainPairView.as_view(), name='token_obtain_pair'),
]

account目錄下創建serializers.py文件:

from django.contrib.auth import get_user_model
from rest_framework import serializers
from django.contrib.auth.hashers import make_password

User = get_user_model()

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'username', 'email', 'password', 'permission_level')
        extra_kwargs = {
            'password': {'write_only': True, 'required': True}
        }

    def create(self, validated_data):
        validated_data['password'] = make_password(validated_data.get('password'))
        return super(UserSerializer, self).create(validated_data)

更新模型

account/models.py中,定義用戶模型:

from django.contrib.auth.models import AbstractUser
from django.db import models

class UserProfile(AbstractUser):
    permission_level = models.CharField(max_length=50, default='standard')

更新設置文件以使用自定義用戶模型

backend/settings.py中,添加以下設置:

AUTH_USER_MODEL = 'account.UserProfile'

更新依賴項

requirements.txt中,包含djangorestframework-simplejwt

djangorestframework-simplejwt

重啟容器來下載新添加的依賴項:

docker-compose -f docker-compose-local.yml down
docker-compose -f docker-compose-local.yml up --build -d

遷移數據庫

進行數據庫遷移以應用新的模型變更:

docker exec -it backend-api-services python manage.py makemigrations account
docker exec -it backend-api-services python manage.py migrate

創建用戶

創建用戶的API請求:

curl --location 'http://localhost:8000/account/create/' \
--header 'Content-Type: application/json' \
--data-raw '{
    "username": "lucien",
    "email": "lucien@gmail.com",
    "password": "lucien",
    "permission_level": "standard"
}'

獲取Access Token

使用用戶名和密碼獲取Access Token:

curl --location 'http://localhost:8000/account/token/' \
--header 'Content-Type: application/json' \
--data '{
  "username": "lucien",
  "password": "lucien"
}'

使用JWT進行身份驗證

在其他App中使用JWT進行身份驗證,首先定義視圖views.py

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated

class HelloWorldView(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request):
        return Response("Hello, world!")

定義路徑urls.py

from django.urls import path
from .views import HelloWorldView

urlpatterns = [
    path('hello/', HelloWorldView.as_view(), name='hello-world'),
]

測試帶入Access Token的請求:

curl --location 'http://localhost:8000/api/hello' \
--header 'Authorization: Bearer <your_access_token>'

使用者的管理

接下來我們需要學習如何管理帳號的使用者,包括調整使用者權限、創建使用者、刪除使用者等操作。

查看和管理使用者

進入Django shell來管理使用者:

docker exec -it backend-api-services python manage.py shell

查看所有帳號:

from django.contrib.auth import get_user_model
User = get_user_model()
users = User.objects.all()
for user in users:
    print(user.username)

查看特定使用者的權限:

user = User.objects.get(username='lucien')
print(user.is_superuser, user.is_staff)

修改使用者的權限:

user.is_superuser = True
user.is_staff = True
user.save()

刪除使用者:

user = User.objects.get(username='lucien')
user.delete()

創建超級帳號

創建超級帳號:

docker exec -it backend-api-services python manage.py createsuperuser

創建後,您可以使用上面的命令對其進行管理。

這樣,我們就完成了Django項目中的JWT認證和使用者管理的設置。在下一篇文章,我們將教會你一步步創建一個基於Django-Rest-Framework的應用

[DAY4] Django與Docker Compose後端開發實戰 - 創建一個基於Django-Rest-Framework的應用


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言