Django REST Framework 教程:认证与权限系统详解

Django REST Framework 教程:认证与权限系统详解

django-rest-framework encode/django-rest-framework: Django REST framework 是一个强大的 Web API 开发工具包,专为 Django 框架设计,提供了一套丰富的功能集来构建 Web API,包括序列化、分页、权限管理等。 django-rest-framework 项目地址: https://gitcode.com/gh_mirrors/dj/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')"

总结

通过本教程,我们实现了以下安全机制:

  1. 用户与代码片段的关联
  2. 基于认证状态的读写控制
  3. 对象级别的操作权限
  4. 多种认证方式支持

这些机制共同构成了一个完整的API安全体系,既保证了灵活性,又确保了数据安全。在实际项目中,开发者可以根据需求进一步扩展这些基础实现。

django-rest-framework encode/django-rest-framework: Django REST framework 是一个强大的 Web API 开发工具包,专为 Django 框架设计,提供了一套丰富的功能集来构建 Web API,包括序列化、分页、权限管理等。 django-rest-framework 项目地址: https://gitcode.com/gh_mirrors/dj/django-rest-framework

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郑悦莲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值