Python 语言 用 Django REST framework 实现用户权限管理 JWT 认证

Python阿木 发布于 15 小时前 1 次阅读


Django REST Framework 实现用户权限管理:JWT 认证详解

在Web应用程序中,用户权限管理是确保数据安全和系统稳定性的关键。Django REST framework(DRF)是一个强大的Web框架,用于构建API,它提供了丰富的工具和功能来处理用户认证和权限管理。本文将围绕Python语言,使用Django REST framework实现用户权限管理,重点介绍JWT(JSON Web Tokens)认证。

环境准备

在开始之前,请确保您已经安装了以下软件:

- Python 3.x
- Django 3.x
- Django REST framework

您可以使用以下命令安装Django和Django REST framework:

bash
pip install django djangorestframework

创建Django项目

创建一个新的Django项目:

bash
django-admin startproject myproject
cd myproject

然后,创建一个应用:

bash
python manage.py startapp myapp

配置Django项目

在`myproject/settings.py`文件中,添加以下配置:

python
INSTALLED_APPS = [
...
'rest_framework',
'myapp',
]

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

这里,我们启用了JWT认证。

创建用户模型

在`myapp/models.py`中,创建一个用户模型:

python
from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
pass

然后,在`myproject/settings.py`中,将`AUTH_USER_MODEL`设置为自定义用户模型:

python
AUTH_USER_MODEL = 'myapp.CustomUser'

创建JWT认证

在`myapp/serializers.py`中,创建一个用户序列化器:

python
from rest_framework import serializers
from .models import CustomUser

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

def create(self, validated_data):
user = CustomUser.objects.create_user(
username=validated_data['username'],
email=validated_data['email'],
password=validated_data['password']
)
return user

在`myapp/views.py`中,创建一个用户视图:

python
from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView
from .serializers import UserSerializer

class UserCreate(APIView):
"""
Create a new user. It's called 'UserCreate' because traditionally we use
the name 'UserCreate' for a view that creates a user.
"""
permission_classes = (permissions.AllowAny,)
serializer_class = UserSerializer

def post(self, request, format=None):
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
user = serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

在`myapp/urls.py`中,添加以下路由:

python
from django.urls import path
from .views import UserCreate

urlpatterns = [
path('register/', UserCreate.as_view(), name='register'),
]

JWT认证

在`myapp/serializers.py`中,创建一个JWT认证序列化器:

python
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework_simplejwt.views import TokenObtainPairView

class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
@classmethod
def get_token(cls, user):
token = super().get_token(user)

Add custom claims
token['username'] = user.username

return token

class MyTokenObtainPairView(TokenObtainPairView):
serializer_class = MyTokenObtainPairSerializer

在`myapp/views.py`中,创建一个JWT认证视图:

python
from rest_framework_simplejwt.views import TokenObtainPairView

class MyTokenObtainPairView(TokenObtainPairView):
serializer_class = MyTokenObtainPairSerializer

在`myapp/urls.py`中,添加以下路由:

python
from django.urls import path
from .views import MyTokenObtainPairView

urlpatterns = [
path('token/', MyTokenObtainPairView.as_view(), name='token'),
]

现在,您可以使用以下命令启动Django开发服务器:

bash
python manage.py runserver

测试JWT认证

使用Postman或其他工具,向`http://localhost:8000/token/`发送POST请求,并包含以下JSON数据:

json
{
"username": "myusername",
"password": "mypassword"
}

您将收到一个包含`access`和`refresh`令牌的响应:

json
{
"access": "your_access_token",
"refresh": "your_refresh_token"
}

现在,您可以使用`access`令牌来访问受保护的端点。

总结

本文介绍了如何使用Django REST framework和JWT认证实现用户权限管理。通过创建自定义用户模型、序列化器和视图,我们实现了用户注册和JWT令牌的生成。您可以根据自己的需求扩展和修改这些代码。

请注意,本文只是一个简单的示例,实际应用中可能需要考虑更多的安全性和性能问题。