一、用户模块
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', }