Django REST框架--认证和权限

教程4:认证和权限

目前,我们的API对谁可以编辑或删除代码段没有任何限制。我们想要一些更先进的行为,以确保:

  • 代码段始终与创建者相关联。
  • 只有身份验证的用户可以创建片段。
  • 只有片段的创建者可以更新或删除它。
  • 未经身份验证的请求应具有完全只读访问权限。

将信息添加到我们的模型

我们将对我们的Snippet模型类进行几次更改。首先,我们添加几个字段。其中一个字段将用于表示创建代码段的用户。另一个字段将用于存储代码的突出显示的HTML表示。

将以下两个字段添加到Snippet模型中models.py

owner = models.ForeignKey(‘auth.User‘, related_name=‘snippets‘, on_delete=models.CASCADE)  #获取记录 删除级联
highlighted = models.TextField()

我们还需要确保在保存模型时,使用pygments代码突出显示库填充突出显示的字段。

我们需要一些额外的导入:

from pygments.lexers import get_lexer_by_name
from pygments.formatters.html import HtmlFormatter
from pygments import highlight

现在我们可以.save()在我们的模型类中添加一个方法:

def save(self, *args, **kwargs):
    """
    Use the `pygments` library to create a highlighted HTML
    representation of the code snippet.
    """
    lexer = get_lexer_by_name(self.language)
    linenos = self.linenos and ‘table‘ or False
    options = self.title and {‘title‘: self.title} or {}
    formatter = HtmlFormatter(style=self.style, linenos=linenos,
                              full=True, **options)
    self.highlighted = highlight(self.code, lexer, formatter)
    super(Snippet, self).save(*args, **kwargs)

完成这些工作后,我们需要更新我们的数据库表。通常我们将创建一个数据库迁移,为了做到这一点,但为了本教程的目的,我们只需删除数据库并重新开始。

rm -f tmp.db db.sqlite3
rm -r snippets/migrations
python manage.py makemigrations snippets
python manage.py migrate

您可能还需要创建几个不同的用户,以用于测试API。执行此操作的最快方法是使用createsuperuser命令。

python manage.py createsuperuser

为我们的用户模型添加端点

现在我们有一些用户可以使用,我们最好将这些用户的表示添加到我们的API中。创建一个新的串行器很容易。在serializers.py添加:

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‘是用户模型的反向关系,所以在使用ModelSerializer该类时它不会被默认包含,所以我们需要为它添加一个显式字段。

我们还会添加几个视图views.py。我们希望只使用只读视图为用户表示,所以我们将使用ListAPIViewRetrieveAPIView通用的基于类的意见。

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

确保也导入UserSerializer

from snippets.serializers import UserSerializer

最后,我们需要通过从URL conf引用它们将这些视图添加到API中。将以下内容添加到其中的模式中urls.py

url(r‘^users/$‘, views.UserList.as_view()),
url(r‘^users/(?P<pk>[0-9]+)/$‘, views.UserDetail.as_view()),

将片段与用户关联

现在,如果我们创建了一个代码片段,那么就没有办法将创建该代码段的用户与代码段实例进行关联。用户不是作为序列化表示的一部分发送的,而是传入请求的属性。

我们处理的方式是覆盖.perform_create()我们的代码片段视图上的方法,这样我们可以修改实例保存的管理方式,并处理传入请求或请求的URL中隐含的任何信息。

SnippetList视图类中,添加以下方法:

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

create()我们的串行器的方法现在将被传递一个附加‘owner‘字段,以及请求中验证的数据。

更新我们的串行器

现在,这些片段与创建它们的用户相关联,我们更新我们SnippetSerializer来反映这一点。将以下字段添加到序列化器定义中serializers.py

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

注意:确保您还添加‘owner‘,到内部Meta类的字段列表。

这个领域正在做一些很有趣的事情。的source哪个属性参数控制用于填充的字段,并且可以在对串行化实例的任何属性点。它也可以采用上面显示的点划线,在这种情况下,它将以与Django的模板语言一样的方式遍历给定的属性。

我们添加了字段是类型化ReadOnlyField类,相对于其他类型的字段,如CharFieldBooleanField等...类型化ReadOnlyField始终是只读的,并且将用于序列化表示形式,但不会被用于更新模型他们被反序列化的实例。我们也可以CharField(read_only=True)在这里使用。

添加视图所需的权限

现在,代码片段与用户相关联,我们希望确保只有经过身份验证的用户才能创建,更新和删除代码段。

REST框架包括许多权限类,我们可以使用它来限制哪些人可以访问给定的视图。在这种情况下,我们正在寻找的是IsAuthenticatedOrReadOnly,这将确保经过身份验证的请求获得读写访问权限,未经身份验证的请求将获得只读访问权限。

首先在视图模块中添加以下导入

from rest_framework import permissions

接着,下面的属性添加到SnippetListSnippetDetail视图类。

permission_classes = (permissions.IsAuthenticatedOrReadOnly,)

添加登录到Browsable API

如果您打开浏览器并浏览到可浏览的API,那么您将发现无法再创建新的代码段。为了做到这一点,我们需要能够以用户身份登录。

我们可以通过编辑项目级urls.py文件中的URLconf来添加可浏览API使用的登录视图。

在文件顶部添加以下导入:

from django.conf.urls import include

而且,在文件末尾添加一个模式以包括可浏览的API的登录和注销视图。

urlpatterns += [
    url(r‘^api-auth/‘, include(‘rest_framework.urls‘,
                               namespace=‘rest_framework‘)),
]

r‘^api-auth/‘模式的一部分实际上可以是您想要使用的任何URL。唯一的限制是包含的URL必须使用‘rest_framework‘命名空间。在Django 1.9+中,REST框架将设置命名空间,因此您可以将其删除。

现在,如果再次打开浏览器并刷新页面,您将在页面右上方看到一个“登录”链接。如果您以您之前创建的用户身份登录,则可以再次创建代码段。

创建了一些代码片段后,导航到“/ users /”端点,并注意到每个用户的“片段”字段中,该表示包含与每个用户相关联的代码段的列表。

对象级权限

我们希望所有的代码段都可以被任何人看到,但也要确保只有创建代码段的用户才能更新或删除它。

为此,我们将需要创建一个自定义权限。

在片段应用中,创建一个新文件, permissions.py

from rest_framework import permissions

class IsOwnerOrReadOnly(permissions.BasePermission):
    """
    Custom permission to only allow owners of an object to edit it.
    """

    def has_object_permission(self, request, view, obj):
        # Read permissions are allowed to any request,
        # so we‘ll always allow GET, HEAD or OPTIONS requests.
        if request.method in permissions.SAFE_METHODS:
            return True

        # Write permissions are only allowed to the owner of the snippet.
        return obj.owner == request.user

现在,我们可以通过编辑视图类中的permission_classes属性将该自定义权限添加到我们的代码段实例端点SnippetDetail

permission_classes = (permissions.IsAuthenticatedOrReadOnly,
                      IsOwnerOrReadOnly,)

确保也导入IsOwnerOrReadOnly类。

from snippets.permissions import IsOwnerOrReadOnly

现在,如果再次打开浏览器,您会发现如果您以与创建代码段相同的用户身份登录,“DELETE”和“PUT”操作只会显示在代码段实例端点上。

使用API??进行身份验证

因为我们现在有一组API的权限,如果我们要编辑任何代码片段,我们需要验证我们的请求。我们还没有设置任何身份验证类,所以默认值现在被应用,哪些是SessionAuthenticationBasicAuthentication

当我们通过Web浏览器与API进行交互时,我们可以登录,然后浏览器会话将为请求提供所需的身份验证。

如果我们以编程方式与API交互,我们需要在每个请求上显式提供身份验证凭据。

如果我们尝试创建一个没有验证的代码段,我们会得到一个错误:

http POST http://127.0.0.1:8000/snippets/ code="print 123"

{
    "detail": "Authentication credentials were not provided."
}

我们可以通过包括我们之前创建的一个用户的用户名和密码来成功申请。

http -a tom:password123 POST http://127.0.0.1:8000/snippets/ code="print 789"

{
    "id": 1,
    "owner": "tom",
    "title": "foo",
    "code": "print 789",
    "linenos": false,
    "language": "python",
    "style": "friendly"
}

概要

我们现在已经在我们的Web API上获得了相当精细的权限,并为系统的用户和他们创建的代码段提供了终点。

接下来我们将介绍如何通过为突出显示的片段创建一个HTML端点来将所有内容结合在一起,并通过使用系统内部关系的超链接来提高API的凝聚力。

时间: 2024-08-28 03:34:48

Django REST框架--认证和权限的相关文章

django的RBAC认证z;自定义auth_user表;认证组件权限组件源码分析;认证组件;权限组件

一 RBAC 1.RBAC:全称(Role-Based Access Control):指的是基于用户权限访问控制的认证. 2.Django框架采用的是RBAC认证规则,RBAC认证规则通常会分为:三表规则,五表规则:Django采用的是六表规则. # 三表:用户表.角色表.权限表# 五表:用户表.角色表.权限表.用户角色关系表.角色权限关系表# 六表:用户表.角色表.权限表.用户角色关系表.角色权限关系表.用户权限关系表 3.在Django中六表之间是都是多对多的关系,可通过下面字段跨表访问

drf框架 8 系统权限类使用 用户中心信息自查 token刷新机制 认证组件项目使用:多方式登录 权限组件项目使用:vip用户权限 频率组件 异常组件项目使用

系统权限类使用 图书接口:游客只读,用户可增删改查权限使用 from rest_framework.permissions import IsAuthenticatedOrReadOnly class BookViewSet(ModelViewSet): # 游客只读,用户可增删改查 permission_classes = [IsAuthenticatedOrReadOnly] queryset = models.Book.objects.all() serializer_class = se

Django Restful Framework【第三篇】认证、权限、限制访问频率

一.认证 认证请求头 views.py #!/usr/bin/env python # -*- coding:utf-8 -*- from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.authentication import BaseAuthentication from rest_framework.permissions import

Django中rest_framework的认证组件,权限组件,频率组件,序列化组件的最简化版接口

url urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login/', views.Login.as_view()), # Book表 url(r'^books/$',views.BookHandle.as_view({ 'get':'list', 'post':'create' })), url(r'^books/(?P<pk>\d+)/',views.BookHandle.as_view({ 'get':'retrieve

DRF框架中其他功能:认证、权限、限流

定义视图时,只要视图继承了APIView或其子类,就可以使用DRF框架的认证.权限和限流功能. 当客户端访问API接口时,DRF框架在调用对应的API接口之前,会依次进行认证.权限和限流的操作. 认证Authentication 权限Permissions 限流Throttling 原文地址:https://www.cnblogs.com/oklizz/p/11290731.html

Django--分页器(paginator)、Django的用户认证、Django的FORM表单

分页器(paginator) >>> from django.core.paginator import Paginator >>> objects = ['john', 'paul', 'george', 'ringo'] >>> p = Paginator(objects, 2) >>> p.count #数据总数 4 >>> p.num_pages #总页数 2 >>> type(p.page

Django Authentication 用户认证系统

一. Django的认证系统 Django自带一个用户认证系统,用于处理用户账户.群组.许可和基于cookie的用户会话. 1.1 概览 Django的认证系统包含了身份验证和权限管理两部分.简单地说,身份验证用于核实某个用户是否是合法用户,权限管理则是决定一个合法用户具有哪些权限.这里,"身份验证"这个词同时代指上面两部分的含义. 系统主要包括: 用户 许可 组 可配置的密码哈希系统 用于用户登录或者限制访问的表单和视图工具 可插拔的后端 类似下面的问题,请使用第三方包: 密码强度检

Django中的认证系统

我们在开发一个网站的时候,无可避免的要设计.实现网站的用户系统.此时我们需要实现包括但不限于用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Django作为一个完美主义者的终极框架,当然也会想到用户的这些痛点.它内置了强大的用户认证系统--auth,它默认使用 auth_user 表来存储用户数据. auth模块 from django.contrib import auth auth中提供了许多实用方法: authenticate()    提供了用户认证功能,即

Django进阶-Auth认证模块

转自:https://www.cnblogs.com/liwenzhou/p/9030211.html Django自带的用户认证系统 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Django作为一个完美主义者的终极框架,当然也会想到用户的这些痛点.它内置了强大的用户认证系统--auth,它默认使用 auth_user 表来存储用户数据. auth模块 authenticate(