Django REST Framework 教程:认证与权限机制详解

Django REST Framework 教程:认证与权限机制详解

django-rest-framework django-rest-framework 项目地址: https://gitcode.com/gh_mirrors/dja/django-rest-framework

前言

在构建Web API时,认证(Authentication)和权限(Permissions)是保障系统安全性的重要机制。本文将深入探讨如何在Django REST Framework中实现这些功能,帮助开发者构建更安全、更规范的API接口。

模型层改造

添加关联字段

首先需要在代码片段模型中添加两个关键字段:

owner = models.ForeignKey('auth.User', related_name='snippets', on_delete=models.CASCADE)
highlighted = models.TextField()
  • owner字段建立了与用户模型的外键关系,表示代码片段的创建者
  • highlighted字段用于存储经过语法高亮处理的HTML内容

实现模型保存逻辑

重写模型的save()方法,在保存时自动生成语法高亮内容:

def save(self, *args, **kwargs):
    lexer = get_lexer_by_name(self.language)
    linenos = 'table' if self.linenos else False
    options = {'title': self.title} if self.title else {}
    formatter = HtmlFormatter(style=self.style, linenos=linenos,
                            full=True, **options)
    self.highlighted = highlight(self.code, lexer, formatter)
    super().save(*args, **kwargs)

用户API端点实现

用户序列化器

创建UserSerializer来序列化用户数据:

class UserSerializer(serializers.ModelSerializer):
    snippets = serializers.PrimaryKeyRelatedField(
        many=True, 
        queryset=Snippet.objects.all()
    )

    class Meta:
        model = User
        fields = ['id', 'username', 'snippets']

这里特别处理了反向关联关系snippets,展示用户创建的所有代码片段ID。

用户视图

使用只读视图展示用户信息:

class UserList(generics.ListAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

class UserDetail(generics.RetrieveAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

认证与权限控制

关联用户与代码片段

在视图层重写perform_create()方法,自动关联当前用户:

def perform_create(self, serializer):
    serializer.save(owner=self.request.user)

序列化器改造

SnippetSerializer中添加只读的owner字段:

owner = serializers.ReadOnlyField(source='owner.username')

source参数支持Django模板式的属性访问语法。

基础权限控制

使用IsAuthenticatedOrReadOnly权限类:

permission_classes = [permissions.IsAuthenticatedOrReadOnly]

该权限允许:

  • 认证用户:读写权限
  • 未认证用户:只读权限

对象级权限控制

创建自定义权限类IsOwnerOrReadOnly

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')),
]

这将提供登录/登出功能,方便在可浏览API界面进行测试。

API认证方式

Django REST Framework默认支持两种认证方式:

  1. SessionAuthentication:基于浏览器会话的认证
  2. BasicAuthentication:HTTP基本认证

在程序化访问API时,需要显式提供认证凭据。例如使用HTTPie工具:

http -a username:password POST /snippets/ code="print('hello')"

总结

通过本教程,我们实现了以下功能:

  1. 将代码片段与创建者关联
  2. 创建用户API端点
  3. 实现基础的认证机制
  4. 设置细粒度的权限控制:
    • 全局读写权限
    • 对象级编辑权限
  5. 为可浏览API添加登录功能

这些安全措施确保了API的规范使用:

  • 未认证用户只能查看
  • 认证用户可创建内容
  • 只有创建者能修改或删除自己的内容

理解并合理运用这些认证和权限机制,是构建安全可靠的RESTful API的关键步骤。

django-rest-framework django-rest-framework 项目地址: https://gitcode.com/gh_mirrors/dja/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、付费专栏及课程。

余额充值