用户身份认证和授权

 【说明】django本身有session的东西

         一开始django本身有session的机制,登录后,就会往数据库里存一个session值。

admin页面登录就是,会存一个session,浏览器并保存了session,就登录成功了。

此文档就是利用了django本身有session写了个登陆和登出的方法,登录时往里session里存了东西,再后续写业务接口时,用这个东西来判断是否登录

CSDN,这里可以操作练习

Web 开发简介 | 白月黑羽    完整的练习看这里

【说明】(视图类、视图集) 都有认证和授权

        只要时APIviews及后代类,都有认证和授权

        此文档说明APIviews有哪些继承类  文档:视图类、视图集_A~taoker的博客-CSDN博客

认证、授权默认配置

查看源码  APIview提供了认证授权的功能。

假如一开始就不配置 DEFAULT_PERMISSION_CLASSES、(默认为AllowAny)

不配置DEFAULT_AUTHENTICATION_CLASSES  (默认为session认证)

授权器默认是:     AllowAny          (所以一开始定义的APIview的接口是可以直接访问的)

用视图集写的接口、 或者函数视图用到了@api_view 语法糖(APIview的后代),接口都可以响应成功

【操作一】认证方式保持默认用session, 授权改成登录才行

表示登录后,才行(再在项目的setting中 的)

REST_FRAMEWORK = {
--------
'DEFAULT_PERMISSION_CLASSES': [
    #1- AllowAny不管是否有认证成功,都能获取所有权限
    #2- IsAdminUser管理员(管理员需要登录)具备所有权限
    #3- IsAuthenticated只要登录,就具备所有权限
    #4- IsAuthenticatedOrReadOnly,如果登录了就具备所有权限,不登录只具备读取数据的权限
    'rest_framework.permissions.IsAuthenticated',]

---------
}

一、 使用浏览器不登录和登录时的对比

登录时访问的 admin 页面进行登录

 退出再刷新一次,就不行了

Django Rest framework接口视图页,也可以配置登录按钮

只需要加一句话,页面就有了登入和登出按钮

这里的登录,和admin页面登录效果一样,也是会存一个sessionid

在外层urls.py文件中设置如下、 路由名称 是随便写的,如这里写的api/

path('api/',include('rest_framework.urls'))

原因:rest_framework 自带了一个urls,里面有login , 和 logout方法 路由和方法的配置

 登录成功后,就可以访问了,还有登出按钮

 postman不登录和登录对比

(只影响apiview 后代的接口)

不登录时

登录时

django restframwork的 session 认证, 用的是django本身的session,

只要一登录,获取到sessionid,  再调用接口时,放到cookies里传递,就能成功

1. postman先登录一下

这里写了一个获取session的登录接口

  •  django表里存了一份:     rghn0orxhwknupqflnwbcc4ycaagtfpf
  •  响应header里,返回了set-cookie,里面有sessionid (postman自动把seesionid存到了cookie)

 登录业务接口

利用django本身的获取session的登录,封装了登录接口

django自有的session校验机制_django用户登录session验证-CSDN博客

 【补充总结】session认证方式图

这样配置好后,通过模型视图集定义的接口就可以 通过session 的方式来认证和授权

【操作二】 认证方式改成jwttoken

DEFAULT_AUTHENTICATION_CLASSES 里面 把JWTtoken写在上面,就会优先用这个

查看没有token时的效果

步骤一,改成如下配置

REST_FRAMEWORK = {
--------

# 指定使用的认证类
# a.在全局指定默认的认证类(指定认证方式)
'DEFAULT_AUTHENTICATION_CLASSES': [
    # 先进行token认证
    'rest_framework_simplejwt.authentication.JWTAuthentication',
    # b.Session会话认证
    'rest_framework.authentication.SessionAuthentication',
    'rest_framework.authentication.BasicAuthentication'
],
# 指定使用的权限类
# a.在全局指定默认的权限类(当认证通过之后,可以获取何种权限)
'DEFAULT_PERMISSION_CLASSES': [
    #1- AllowAny不管是否有认证成功,都能获取所有权限
    #2- IsAdminUser管理员(管理员需要登录)具备所有权限
    #3- IsAuthenticated只要登录,就具备所有权限
    #4- IsAuthenticatedOrReadOnly,如果登录了就具备所有权限,不登录只具备读取数据的权限
    'rest_framework.permissions.IsAuthenticatedOrReadOnly',
],


------
}

补充:没有token,假如有sessionid 也可以登录的

步骤二:首先把  sessionid给删了,不让他用session的方式通过

查看有token时的效果

步骤三

登录获取token,参考  【Django】基于Jwt的token认证(登录接口)_could not import 'rest_framework_jwt.authenticatio-CSDN博客

把这个token 复制到 业务接口 请求头的Authorization里,这样又请求成功了

【补充】

局部配置

        除了以上介绍的全局配置,还有局部配置(优先级更高),如下图、

项目中的做法(不想读文档直接看过来了)

全局配置(配成:登录才能用)

'DEFAULT_AUTHENTICATION_CLASSES': [
    # 先进行token认证
    'rest_framework_simplejwt.authentication.JWTAuthentication',
    # b.Session会话认证
    'rest_framework.authentication.SessionAuthentication',
    'rest_framework.authentication.BasicAuthentication'
],
# 指定使用的权限类
# a.在全局指定默认的权限类(当认证通过之后,可以获取何种权限)
'DEFAULT_PERMISSION_CLASSES': [
    #1- AllowAny不管是否有认证成功,都能获取所有权限
    #2- IsAdminUser管理员(管理员需要登录)具备所有权限
    #3- IsAuthenticated只要登录,就具备所有权限
    #4- IsAuthenticatedOrReadOnly,如果登录了就具备所有权限,不登录只具备读取数据的权限
    'rest_framework.permissions.IsAuthenticated',
],

   sq的做法:在自定义的BaseModelViewSet 里面,也 设置了 授权为 IsAuthenticated

(也相当于全局配置设置了这个)

登录啊,注册啊,局部配置为 AllyowAny

其他的补充(找源码,找文件):

  • 1 . 一种方式,两次shift ,适用于找文件名 (找文件见名)
  • 2. 一种方式(适合找内容):
    • 先不停ctrl+左键,点到源码,然后点击pycharm上方的  【靶心】按键,找到源码目录 
    • 在目录的 外层目录右键,选择 find in files 进行搜索

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值