二十二、身份验证与权限

一、 准备工作

为了讲清楚身份验证与权限,我们再创建一个应用projects,设计模型如下:

class Project(models.Model):name = models.CharField('项目名称', max_length=20, help_text='项目名称')desc = models.CharField('项目描述', max_length=200, help_text='项目描述', null=True, blank=True)leader = models.ForeignKey('auth.User', verbose_name='项目负责人', on_delete=models.SET_NULL, null=True, help_text='项目负责人')c_time = models.DateTimeField('创建时间', auto_now_add=True)

编写序列化器

from rest_framework import serializers
from .models import Projectclass ProjectSerializer(serializers.ModelSerializer):class Meta:model = Projectfields = '__all__'

编写视图集

class ProjectViewSet(ModelViewSet):queryset = Project.objects.all()serializer_class = ProjectSerializer

配置url

router = DefaultRouter()
router.register(r'projects', views.ProjectViewSet)
urlpatterns = [...path('', include(router.urls))
]

目前,我们的API对谁可以编辑或删除项目没有任何限制。我们希望有一些更高级的行为,以确保:

  • 项目总是与创建者相关联。
  • 只有经过身份验证的用户才能创建项目。
  • 只有项目的创建者才能更新或删除它。
  • 未经身份验证的请求应该具有完全只读访问权限。

创建用户方法一:

我们需要先创建一个超级管理员。不然我们项目Project模型中leader外键关联的auth.User表没有数据,创建Project的时候选不到数据。

# 创建超级管理员
python manage.py createsuperuser

 

 

创建用户方法二:

有了超级用户可以访问网址去创建,输入你刚才创建的超级管理员

 

 

因为考虑后面需要测普通管理员的权限,我们去把其中一个超级管理员的权限卸掉。

此时我们去创建一个项目负责人为test的项目。 

因为我们登录着,所以我们可视化api右上角才显示登录的状态。

 

 

 这个时候我们访问 http://127.0.0.1:8000/admin/auth/user/   退出登录,再看下drf可视化的api右上角就不展示登录的用户名。

此时就是一个匿名的状态。 

 

那么此时我去做修改或者添加的操作,能执行成功吗?当然可以。

因为你当前写的跟用户权限没有任何关系,谁都可以去操作修改、删除、添加等一系列的操作。

 

 那么我们现在就要做2件事情:

1. 谁创建这个项目,这个项目就跟谁关联(好比我去超市买东西,扣的是我的钱而不是别人的钱)。

2. 登录后方有权限去创建、修改删除等一系列操作。

二、关联项目与用户

现在我们可以创建项目,并手动选择对应的用户与项目进行关联。但是在某些场景下这可能不是你想要的,比如谁创建项目就把谁与创建的项目进行关联。

那么用户就不能再作为序列化表示的一部分发送,而是传入请求的一个属性。django会将当前用户对象设置到request.user属性上,它是在中间件AuthenticationMiddleware中完成的。

我们首先修改项目的序列化器,将leader字段修改为只读,并显示用户的用户名。

方法一:

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

source参数控制哪个属性用于填充字段,并可以指向序列化实例上的任何属性。它也可以采用上面所示的句点符, 在这种情况下,它将遍历给定的属性, 与Django的模板语言使用的方式类似。

ReadOnlyField始终是只读的,并将用于序列化表示,但当模型实例被反序列化时,将不会用于更新它们。

方法二:

 

然后再重写项目视图上的perform_create()方法,修改保存实例保存的方式,处理隐式传入请求或者请求URL中的任何信息,这里我们给项目关联当前用户。

ProjectViewSet视图集上,添加以下方法:

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

三、添加登录功能

此时创建项目你会发现报错,这是因为,django在未做身份验证的请求的user属性上绑定了一个AnonymousUser对象。我们需要能够以用户身份登录。

通过编辑根urls.py文件中的URLconf,我们可以添加一个login视图来与可浏览的API一起使用。

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

urlpatterns += [path('auth/', include('rest_framework.urls')),
]

模式的'auth/'部分实际上可以是你想使用的任何URL。

现在,如果你再次打开浏览器并刷新页面,你会在页面的右上角看到一个“Login”链接。登录之前创建的用户,你将能够再次创建项目。

 

四、向视图添加权限

现在我们希望确保只有经过身份验证的用户才能创建、更新和删除项目。REST框架包括许多权限类,我们可以使用它们来限制谁可以访问给定的视图。在这个例子中,我们要找的是IsAuthenticatedOrReadOnly,这将确保经过身份验证的请求获得读写访问权限,而未经身份验证的请求获得只读访问权限。

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

from rest_framework import permissions

然后,将下列属性添加到ProjectListCreateView和ProjectDetailUpdateDeleteView视图类中。

permission_classes = [permissions.IsAuthenticatedOrReadOnly]

现在退出登录,你会发现在项目列表页面的POST请求表单不见了,项目详情页的update,put按钮也看不见了。

五、对象级权限

再创建一个用户并登录,你会发现可以对前面用户创建的项目进行编辑。

实际上,我们希望所有项目对任何人都可见,但也要确保只有创建了项目的用户才能更新或删除它。

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

在projects应用程序中,创建一个新文件permissions.py,编写如下代码:(咋知道咋写的,去看下别人封装好的权限是咋写的)

from rest_framework import permissionsclass IsOwnerOrReadOnly(permissions.BasePermission):"""自定义权限只允许对象的leader才能编辑它"""def has_object_permission(self, request, view, obj):if request.method in permissions.SAFE_METHODS:return Truereturn obj.leader == request.user

将它添加到ProjectDetailUpdateDeleteView视图上

permission_classes = [permissions.IsAuthenticatedOrReadOnly,IsOwnerOrReadOnly]

现在,再次打开浏览器,你会发现,只有当登录用户与当前代码片段的创建用户相同时,DELETEPUT按钮才会出现在页面上。

六、身份验证

身份验证是将传入请求与一组识别凭证相关联的机制,例如请求携带的用户名密码,签名令牌等。然后权限之类的限制策略才可以使用这些凭证来确定是否应该允许请求。

身份验证始终在视图的最开始运行,在权限和限制检查发生之前,在任何其他代码被允许继续之前。

REST框架提供多种开箱即用的身份验证方案,后面项目实战时,我们再讨论。

七、权限验证

与身份验证,限流一起,权限决定是否应该授予或拒绝访问请求。

权限检查总是在视图的最开始运行,在任何其他代码被允许继续之前。权限检查通常会使用request.userrequest.auth属性中的身份验证信息来确定是否应允许传入请求。

权限用于授予或拒绝不同类别的用户访问 API 的不同部分。

最简单的权限样式是允许任何经过身份验证的用户访问,而拒绝任何未经身份验证的用户访问。

八、如何确定权限

DRF中权限始终定义为权限列表。在运行视图的主体之前,检查列表中的每个权限。如果任何权限检查失败,将引发exceptions.PermissionDeniedorexceptions.NotAuthenticated异常,并且视图的主体将不会运行。当权限检查失败时,将根据以下规则返回“403 Forbidden”或“401 Unauthorized”响应:

  • 请求已成功验证,但权限被拒绝。— 将返回 HTTP 403 Forbidden 响应。
  • 请求未成功通过身份验证,最高优先级的身份验证类使用WWW-Authenticate标头。— 将返回 HTTP 403 Forbidden 响应。
  • 请求的身份验证没有成功,并且最高优先级的身份验证类确实使用了WWW-Authenticate头。一个HTTP 401未经授权的响应,将返回一个适当的WWW-Authenticate报头。

九、对象级权限

REST 框架权限还支持对象级权限。对象级权限用于确定是否应允许用户对特定对象进行操作,该对象通常是模型实例。

对象级权限由REST框架的通用视图调用.get_object时运行。与视图级别权限一样,也有例外。如果不允许用户对给定对象进行操作,则会引发PermissionDenied异常。

如果您正在编写自己的视图并希望强制执行对象级权限,或者覆盖了通用视图上的get_object方法,那么您需要在视图方法中显示的调用.check_object_permissions(request, obj)

十、设置权限策略

可以使用设置全局设置默认权限策略DEFAULT_PERMISSION_CLASSES。例如。

REST_FRAMEWORK = {'DEFAULT_PERMISSION_CLASSES': ['rest_framework.permissions.IsAuthenticated',]
}

如果未指定,此设置默认为允许不受限制的访问:

'DEFAULT_PERMISSION_CLASSES': ['rest_framework.permissions.AllowAny',
]

您还可以使用基于APIView类的视图,在每个视图或每个视图集的基础上设置权限策略

from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIViewclass ExampleView(APIView):permission_classes = [IsAuthenticated]

或者使用基于装饰器@api_view的函数视图

from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated@api_view(['GET'])
@permission_classes([IsAuthenticated])
def example_view(request, format=None):pass

注意:直接在视图上设置权限类列表后,会忽略设置文件中配置的权限类列表。

十一、内置权限

AllowAny

IsAuthenticated

IsAdminUser

IsAuthenticatedOrReadOnly

十二、自定义权限

要实现自定义权限,请重写BasePermission并实现以下方法中的一个或两个:

●.has_permission(self, request, view)
●.has_object_permission(self, request, view, obj)

如果请求被授予访问权限,则该方法应返回True,否则返回False。

注意:对象级的has_object_permission方法只有在视图级的has_permission检查已经通过的情况下才会被调用。

如果测试失败,自定义权限将引发一个PermissionDenied异常。若要更改与异常关联的错误消息,请在自定义权限上直接实现message属性。否则,将使用PermissionDenied的default_detail属性。类似地,要更改与异常相关的代码标识符,请直接在自定义权限上实现一个code属性——否则将使用PermissionDenied的default_code属性。
 

from rest_framework import permissionsclass CustomerAccessPermission(permissions.BasePermission):message = 'Adding customers not allowed.'def has_permission(self, request, view):...

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/25804.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人脸核身基础版 SDK 接入 > 合作方后台上送身份信息

文章目录 一、概述二、实现流程2.1. 获取获取 access_token2.2. 获取 SIGN ticket2.3. 生成签名2.4. 上送身份信息2.5. 获取 NONCE ticket 三、实战3.1. 获取获取 access_token3.2. 获取 SIGN ticket3.3. 生成签名3.4. 上送身份信息3.5. 获取 NONCE ticket 四、开源地址 一、概…

身份证验证接口API(仅需一行代码,公安部实时接口)

身份确认在互联网越来越普及,在二手、电商、贷款、交友、招聘等主流互联网应用中都有明确的刚需,传统的 身份证核验方式是用户上传身份证图片,客服后台人肉审核,但问题在于根本无从确认身份证的真实性,也不能确认该身份…

危!GPT将影响80%工作岗位,挣得越多越危险?OpenAI发布重磅研究

源|新智元 GPT-4发布没几天,OpenAI直接告诉所有人,GPTs是通用技术,80%的美国人的工作受到影响。想要保命,且看这34大「铁饭碗」。 前脚刚推出GPT-4,OpenAI后脚就发布了35页论文官宣: 80%的美国人…

音视频技术开发周刊 | 286

每周一期,纵览音视频技术领域的干货。 新闻投稿:contributelivevideostack.com。 比尔盖茨:AI 时代开启 盖茨谈到AI如何改善人类的不平等现象,并在医疗、教育等方面做出贡献,但也存在风险。 GPT-4 Copilot X震撼来袭&a…

对话 ClickHouse CTO Alexey:目光不仅限于成为最快的数据库 | 近匠

作为世界上最快的 OLAP 列式数据库之一,ClickHouse 能在毫秒级的时间内处理数百亿行的数据。ClickHouse 公司在官网上,也是简单扼要地介绍了自己的数据库:“Fast”。 ClickHouse 的灵魂人物 AlexeybMilovidov,则是一位将“慢”践行…

马斯克放话:没有我就没有 OpenAI,连名字都是我起的!

整理 | 郑丽媛 出品 | CSDN(ID:CSDNnews) 在 ChatGPT、GPT- 4 的爆火下,近来 OpenAI 这个名字已逐渐成为科技圈的“高频热词”,其创立初期与马斯克之间的“恩怨”也被时常提及。 有人说自从马斯克走后,Open…

阿里云版Chat-gpt申请内测

不允许你还不知道阿里云的chat-gpt,快去申请 -- 内测申请地址:通义千问

C++图像处理 -- 图像合成

阅读提示: 《C图像处理》系列以代码清晰,可读性为主,全部使用C代码。 《Delphi图像处理》系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM。 尽可能保持二者内容一致,可相互对照。 本文代码必须包括…

图像合成与图像融合

这一次我来给大家介绍一下图像合成与融合。 我们经常看到一些很奇妙的PS技术,例如下面这张,它把1928年的一位叫做Frankie Yale的黑帮老大被杀时的照片,与现在这栋房子的照片无缝融合在一起: 还有这张,将1945年柏林街道…

Chrome安装油猴插件详细教程

Chrome安装油猴插件详细教程 一、油猴安装方法 方法一:Google官方商店安装(推荐,需要科学上网) 方法二:本地安装(无需科学上网,不会科学上网的适用) 二、安装油猴插件 方法一&am…

Tampermonkey 油猴脚本,chrome插件

tampermonkey脚本是一款在谷歌浏览器上经常使用到的浏览器脚本插件,油猴脚本不仅为用户提供了大量的免费脚本插件外,而且还可以帮助你对这些脚本插件进行统一管理,当有最新版本的脚本推出的时候,它会帮助你进行自动更新。当然&…

手机上使用油猴插件 Tampermonkey

油猴 即 Tampermonkey中文名俗称油猴,是一款浏览器上的扩展,用户可以通过Tampermonkey添加和使用脚本,而脚本是一种可以修改网页JavaScript的程序。 在PC端,可以通过 Chrome浏览器的扩展程序,再结合 脚本 可以实现各种…

Tampermonkey油猴插件安装使用

Tampermonkey油猴插件安装使用 Tampermonkey油猴插件——安装与使用教程 Tampermonkey的crx文件,将下载下来的压缩包解压出来,其中类型为CRX文件 就是接下来需要用到的安装文件 打开浏览器设置,打开扩展程序页面,或者直接搜索Chr…

关于油猴(Tampermonkey)

油猴Tampermonkey 是一款免费的浏览器扩展和最为流行的用户脚本管理器,它适用于多款常见的浏览器。 前言 那么,油猴具体能干啥? 它可以让我们使用浏览器时更加便捷。 比如说,对于一些网页限制的解除,某度盘文件直接…

Tampermonkey油猴插件——安装与使用教程

安装步骤: Tampermonkey 是一款免费的浏览器扩展和最为流行的用户脚本管理器,它适用于 Chrome, Microsoft Edge, Safari, Opera Next, 和 Firefox。 油猴插件下载网址:Tampermonkey • Home Beta是测试版; Stable是稳定版&am…

安装油猴(Tampermonkey)插件,让你的浏览器更强大

插件是什么 插件及扩展程序,目前大多数软件及程序都提供了安装插件的功能(edge,chrome,vscode,pycharm,office等),游戏外挂也是一种插件,这也是使程序功能强大的手段&…

油猴脚本(Tampermonkey)的简介

油猴脚本的使用 什么是油猴脚本 「油猴」可以通过安装各类脚本对网站进行定制。当然伟大的脚本面向的是所有上网者,所以借由各位大神的脚本我们能实现更多更强大的功能,例如: 直接下载百度网盘文件(全速)重新定制繁杂的微博页面去掉视频播放…

ChatGpt-2 对话单页功能实现vue3+elementplus

接口可参照CHATGPT.NET自行实现 <script setup> import { RouterLink, RouterView } from "vue-router"; import HelloWorld from "./components/HelloWorld.vue"; import { MoreFilled ,CircleCheck} from "element-plus/icons-vue"; …

超乎你的想象AI绘画

(https://img-blog.csdnimg.cn/d1e19127400749818fde963723a194a9.png)(https://img-blog.csdnimg.cn/b8535f2f0b4f402ea2003ec8f352d11e.png)

【5月比赛合集】80场可报名的数据挖掘大奖赛,任君挑选!

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 以下信息仅供参考&#xff0c;以比赛官网为准 目录 Kaggle&#xff08;10场比赛&#xff09;阿里天池&#xff08…