Django REST Framework 教程:认证与权限系统详解
前言
在构建Web API时,认证(Authentication)和权限(Permissions)是两个核心的安全机制。本文将深入探讨如何在Django REST Framework中实现完整的认证和权限控制体系,帮助开发者构建更安全的API服务。
模型层改造
添加用户关联字段
首先我们需要修改Snippet模型,建立与用户模型的关联关系:
from django.contrib.auth.models import User
from pygments.lexers import get_lexer_by_name
from pygments.formatters.html import HtmlFormatter
from pygments import highlight
class Snippet(models.Model):
owner = models.ForeignKey(User, related_name='snippets', on_delete=models.CASCADE)
highlighted = models.TextField()
def save(self, *args, **kwargs):
"""
使用pygments库生成代码高亮HTML
"""
lexer = get_lexer_by_name(self.language)
formatter = HtmlFormatter(style=self.style,
linenos='table' if self.linenos else False,
full=True)
self.highlighted = highlight(self.code, lexer, formatter)
super().save(*args, **kwargs)
这里我们添加了两个关键字段:
owner
: 关联到Django内置的User模型highlighted
: 存储代码高亮后的HTML内容
数据库迁移
修改模型后需要执行数据库迁移:
python manage.py makemigrations snippets
python manage.py migrate
用户API实现
用户序列化器
创建UserSerializer来序列化用户数据:
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']
这里特别处理了反向关联关系snippets
,使用PrimaryKeyRelatedField展示用户关联的代码片段ID列表。
用户视图
实现只读的用户API视图:
from django.contrib.auth.models import User
class UserList(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
class UserDetail(generics.RetrieveAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
代码片段与用户关联
自动关联创建者
重写perform_create
方法,在创建代码片段时自动关联当前用户:
class SnippetList(generics.ListCreateAPIView):
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
更新序列化器
在SnippetSerializer中添加owner字段:
owner = serializers.ReadOnlyField(source='owner.username')
ReadOnlyField
确保该字段在序列化时显示,但反序列化(创建/更新)时不会被修改。
权限控制系统
基础权限
使用IsAuthenticatedOrReadOnly
权限类:
from rest_framework import permissions
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
这种配置下:
- 认证用户:拥有读写权限
- 未认证用户:只有读权限
对象级权限
实现自定义权限类,确保只有创建者能修改自己的代码片段:
from rest_framework import permissions
class IsOwnerOrReadOnly(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
if request.method in permissions.SAFE_METHODS:
return True
return obj.owner == request.user
然后在视图中使用:
permission_classes = [
permissions.IsAuthenticatedOrReadOnly,
IsOwnerOrReadOnly
]
认证机制
可浏览API登录
在项目URL配置中添加登录入口:
urlpatterns += [
path('api-auth/', include('rest_framework.urls')),
]
编程式访问认证
通过HTTP Basic Auth进行认证:
http -a username:password POST http://example.com/snippets/ code="print('hello')"
总结
通过本教程,我们实现了以下安全机制:
- 用户与代码片段的关联
- 基于认证状态的读写控制
- 对象级别的操作权限
- 多种认证方式支持
这些机制共同构成了一个完整的API安全体系,既保证了灵活性,又确保了数据安全。在实际项目中,开发者可以根据需求进一步扩展这些基础实现。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考