zoukankan      html  css  js  c++  java
  • 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',
    }
  • 相关阅读:
    MVB设备分类
    MVB帧
    也说析构---C++
    oracle中以dba_、user_、v$_、all_、session_、index_开头
    查看Oracle的表中有哪些索引(用user_indexes和user_ind_columns)
    Spark_总结五
    Spring编程式和声明式事务实例讲解
    缓存穿透,缓存击穿,缓存雪崩解决方案分析
    redis持久化2
    redis的持久化方式
  • 原文地址:https://www.cnblogs.com/erchun/p/14498985.html
Copyright © 2011-2022 走看看