在这个数字化时代,Web应用的安全性问题愈发重要。用户认证和权限管理是确保应用安全的关键环节。Django,作为Python最流行的Web框架之一,提供了丰富的中间件支持。今天,我们将一起学习如何使用JWT(JSON Web Tokens)认证中间件,在Django项目中轻松实现用户认证与权限管理。
准备工作
在开始之前,请确保您已安装以下依赖:
pip install django djangorestframework django-jwt
此外,您需要创建一个Django项目并设置好基本的Django环境。
第一步:创建用户模型
首先,我们需要创建一个用户模型来存储用户信息。以下是一个简单的用户模型示例:
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
class MyUserManager(BaseUserManager):
def create_user(self, email, password=None, **extra_fields):
if not email:
raise ValueError(‘The Email field must be set’)
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, password, **extra_fields):
extra_fields.setdefault(‘is_staff’, True)
extra_fields.setdefault(‘is_superuser’, True)
if extra_fields.get(‘is_staff’) is not True:
raise ValueError(‘Superuser must have is_staff=True.’)
if extra_fields.get(‘is_superuser’) is not True:
raise ValueError(‘Superuser must have is_superuser=True.’)
return self.create_user(email, password, **extra_fields)
class MyUser(AbstractBaseUser):
email = models.EmailField(verbose_name=’email address’, max_length=255, unique=True)
first_name = models.CharField(max_length=30, blank=True)
last_name = models.CharField(max_length=30, blank=True)
is_staff = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
date_joined = models.DateTimeField(verbose_name=’date joined’, auto_now_add=True)
USERNAME_FIELD = ’email’
REQUIRED_FIELDS = []
objects = MyUserManager()
def __str__(self):
return self.email
def has_perm(self, perm, obj=None):
return True
def has_module_perms(self, app_label):
return True
@property
def is_superuser(self):
return self.is_staff
接下来,您需要在
settings.py
中注册此用户模型:
AUTH_USER_MODEL = ‘myapp.MyUser’
第二步:创建JWT认证中间件
接下来,我们将创建一个JWT认证中间件,用于处理用户的登录、登出和权限验证。
from django.contrib.auth import get_user_model
from django.contrib.auth.middleware import AuthenticationMiddleware
from django.utils.deprecation import MiddlewareMixin
from rest_framework_jwt.authentication import JWTAuthentication
class MyJWTAuthentication(MiddlewareMixin):
def process_request(self, request):
# 登录处理逻辑
pass
def process_response(self, request, response):
# 登出处理逻辑
pass
然后,在
settings.py
中注册JWT认证中间件:
MIDDLEWARE = [
# …
‘myapp.middleware.MyJWTAuthentication’,
‘django.contrib.auth.middleware.AuthenticationMiddleware’,
# …
]
第三步:配置JWT认证
在
settings.py
中,配置JWT认证相关的设置:
JWT_AUTH = {
‘JWT_EXPIRATION_DELTA’: 3600, # token过期时间,单位为秒
‘JWT_ALLOW_REFRESH’: True, # 允许刷新token
‘JWT_REFRESH_EXPIRATION_DELTA’: 24 * 3600, # 刷新token过期时间,单位为秒
‘JWT_RESPONSE_PAYLOAD_KEY’: ‘data’, # 返回的token payload中自定义的key
}
第四步:创建JWT认证视图
创建一个JWT认证视图,用于处理用户登录和刷新token的请求:
from rest_framework_jwt.views import obtain_jwt_token, refresh_jwt_token
from rest_framework.permissions import IsAuthenticated
class JWTLoginView(APIView):
permission_classes = (AllowAny,)
def post(self, request, *args, **kwargs):
serializer = MyUserLoginSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.validated_data.get(‘user’)
return Response(obtain_jwt_token({‘username’: user.username}))
class JWTRefreshView(APIView):
permission_classes = (IsAuthenticated,)
def post(self, request, *args, **kwargs):
return Response(refresh_jwt_token(request))
在
urls.py
中配置视图的URL:
urlpatterns = [
# …
path(‘login/’, JWTLoginView.as_view(), name=’login’),
path(‘refresh/’, JWTRefreshView.as_view(), name=’refresh’),
# …
]
第五步:使用JWT认证
现在,您可以使用JWT认证进行用户登录和刷新token。以下是一个使用JWT认证的示例:
import requests
# 用户登录
response = requests.post(‘http://127.0.0.1:8000/login/’, data={
‘username’: ‘user@example.com’,
‘password’: ‘password’
})
token = response.json().get(‘token’)
# 使用token访问受保护的路由
headers = {‘Authorization’: f’Bearer {token}’}
response = requests.get(‘http://127.0.0.1:8000/protected-route/’, headers=headers)
至此,您已经成功实现了Django JWT认证中间件,并可以轻松地进行用户认证和权限管理。希望这个实战教程对您有所帮助!