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默认支持两种认证方式:
- SessionAuthentication:基于浏览器会话的认证
- BasicAuthentication:HTTP基本认证
在程序化访问API时,需要显式提供认证凭据。例如使用HTTPie工具:
http -a username:password POST /snippets/ code="print('hello')"
总结
通过本教程,我们实现了以下功能:
- 将代码片段与创建者关联
- 创建用户API端点
- 实现基础的认证机制
- 设置细粒度的权限控制:
- 全局读写权限
- 对象级编辑权限
- 为可浏览API添加登录功能
这些安全措施确保了API的规范使用:
- 未认证用户只能查看
- 认证用户可创建内容
- 只有创建者能修改或删除自己的内容
理解并合理运用这些认证和权限机制,是构建安全可靠的RESTful API的关键步骤。
django-rest-framework 项目地址: https://gitcode.com/gh_mirrors/dja/django-rest-framework
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考