在上一篇技術教學文章中,我們已經介紹了如何在Django項目中整合MariaDB和Redis。MariaDB替代了預設的SQLite3數據庫,提供了更強大的數據處理能力和高並發支持,而Redis則作為高性能的鍵值對數據庫,實現了快速的數據緩存。
今天,我們將進一步深入,探討如何在Django項目中實現JWT(JSON Web Token)認證系統,並介紹如何管理使用者。JWT是一種輕量級的認證機制,廣泛應用於現代Web應用中,提供安全的身份驗證和信息交換,它通過生成加密的token來驗證用戶身份,每次用戶請求時,服務端都會檢查這個token的合法性。JWT的優點在於它無需在服務端存儲會話數據,所有必要的信息都包含在token中,這使得其具有高效和擴展性強的特點。我們將手把手教學,從創建認證App開始,到設置JWT和使用者管理,讓您的Django項目更加完善和安全。
首先,我們需要創建一個用來認證的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),
}
在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
在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:
curl --location 'http://localhost:8000/account/token/' \
--header 'Content-Type: application/json' \
--data '{
"username": "lucien",
"password": "lucien"
}'
在其他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的應用