Django-15-用户模块、认证授权、session会话认证和token认证

一、用户模块

Django中有提供user模块,如果自己想要修改,可以通过如下步骤

1、新建users用户模块

如果需要重新修改或增加字段,可以在模块中导入from django.contrib.auth.models import AbstractUser,再修改

 2、修改settings.py文件

global_settings.py提供了 AUTH_USER_MODEL = 'auth.User'

如果自定义,可以再settings.py文件中重新定义 AUTH_USER_MODEL = 'users.Users'

二、认证和授权 

什么是认证和授权?
a.认证:使用哪种方式能获取权限(session认证,token认证)
b.授权:通过认证之后,能具备哪些权限

 1、修改权限/认证

rest_framework/settings.py中

# 默认认证方式
'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication'
    ],
# 默认权限
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.AllowAny',

如果要改默认权限,可在项目settings.py中修改

 #指定使用的权限类
 #   a.默认DRF框架使用的权限类为AllowAny,具备所有权限
    'DEFAULT_PERMISSION_CLASSES': [
    'rest_framework.permissions.AllowAny',
  #  b.指定DRF中提供的IsAuthenticated权限类,只要登录就具备所有权限,如果不登录,则部具备任何权限
  #  可以使用python manage.py createsupseruser创建超级管理员
        'rest_framework.permissions.IsAuthenticated',
    ],

DRF中自带的权限:

 2、单个类视图指定权限

一般在视图指定权限,在全局指定认证方式

a.一般不会在全局指定权限(全局使用AllowAll)
b.往往会在需要设置权限的类视图中permission_classes指定当前类的权限类
c.在类视图中指定的permission_classes优先级高于全局

from rest_framework import permissions

 permission_classes = [permissions.IsAuthenticated]
# d.指定类视图使用的认证类
# e.在类视图中指定的authentication_classes优先级高于全局
authentication_classes = [authentication.SessionAuthentication, authentication.BasicAuthentication]

3、创建超级用户

python manage.py createsuperuser

 三、auth模块提供的各项功能

1、urls.py

。。Libsite-packagesdjangocontribauthurls.py

。。。Libsite-packages est_frameworkurls.py

在项目utls.py文件中添加路径,即可访问登录页面

urlpatterns = [
 。。。
    path('users/', include('users.urls')),
]

 

 四、session会话认证和token认证

cookie和session区别

cookie往往存放在浏览器,是浏览器存放数据的一种机制

session存放在后端(mysql或者redis等等的数据库)

两者往往配合使用,session生成的sessionid存放在cookie中

现在比较常用的是token认证

 

 五、token

 

 

 

 1、下载

pipenv install djangorestframework-jwt

2、使用jtw token登录

# 指定使用的认证类
    # a.默认DRF框架使用的认证类为session会话认证
    'DEFAULT_AUTHENTICATION_CLASSES': [
        # 指定使用JWT Token认证
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        # b.指定session会话认证类
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication'
    ],

。。。Libsite-packages est_framework_jwtviews.py中obtain_jwt_token = ObtainJSONWebToken.as_view()

users模块中添加urls.py

from django.urls import path, include
from rest_framework import routers
from rest_framework_jwt.views import obtain_jwt_token

urlpatterns = [
   path('login/', obtain_jwt_token)
]

把上述路由添加到项目全局路由中

 path('users/', include('users.urls')),

3、重写JWT前缀

# a.可以在全局配置settings.py中JWT_AUTH里,重写JWT相关参数
JWT_AUTH = {
    # b.指定TOKEN认证时,前端请求头中TOKEN认证值的前缀
    # c.前端需要在请求头中传递key为Authorization,value为前缀 token值,默认前缀为JWT
    'JWT_AUTH_HEADER_PREFIX': 'Bears',
}

4、login接口获取token返参加上id,name等字段

重写jwt_response_payload_handler方法

def jwt_response_payload_handler(token, user=None, request=None):

    return {
        'token': token,
        'user_id': user.id,
        'username': user.username
    }

在settings.py中加上

JWT_AUTH = {
。。。
    'JWT_RESPONSE_PAYLOAD_HANDLER':
        'utils.handle_jwt_response.jwt_response_payload_handler',
}
原文地址:https://www.cnblogs.com/erchun/p/14498985.html