zoukankan      html  css  js  c++  java
  • Django 用户状态管理,认证,失效

    Django 用户状态管理

    背景

    网站是一个前后端分离的方式,但是需要用户登录,由于网站是没有外部侵入第三方的风险,所以不用考虑 CSRF 攻击,因此直接从中间件关掉 CSRF 就可以了。
    具体操作;

    setting.py 文件, 注释 csrf 那一行
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        # 'django.middleware.csrf.CsrfViewMiddleware', # 网站不会被注入第三方链接,不存在借用cookie的问题,可以关闭
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]
    

    最后需要解决接口的认证问题。

    有两种方法:

    1. 使用 Django 的 Seesion 来管理,配合 admin 自带的 User 类
    2. 使用 JWT 来进行管理

    Session 来管理

    我们举几个例子来演示,

    添加 url

    在 url.py 文件

    from django.contrib import admin
    from django.urls import path
    from myapp import views
    
    urlpatterns = [
        path('admin/', admin.site.urls),
    
        path('userLogin/', views.user_login),
        path('getInfo/', views.get_info),
        path('get_logout/', views.get_logout),
        path('get_info_noAuth/', views.get_info_noAuth),
    ]
    

    编写 view.py 函数

    在 view.py 的头文件

    import json
    
    from django.contrib import auth
    from django.contrib.auth import authenticate, login
    from django.contrib.auth.decorators import login_required
    from django.http import JsonResponse
    from django.shortcuts import render
    
    1. 不需要登录 get 的方法
    def get_info_noAuth(request):
        data = 'some info without auth'
        return JsonResponse(
            {
                'code': 200,
                'message': '请求成功',
                'data': data
            }
        )
    
    1. 需要登录的 post 方法,可以利用 @login_required() 装饰器解决
    @login_required()
    def get_info(request):
        data = 'some info'
    
        return JsonResponse(
            {
                'code': 200,
                'message': '请求成功',
                'data': data
            }
        )
    
    1. 登录方法
    def user_login(request):
        obj = json.loads(request.body)
        username = obj.get('username', None)
        password = obj.get('password', None)
    
        if username is None or password is None:
            return JsonResponse({'code': 500, 'message': '请求参数错误'})
    
        is_login = authenticate(request, username=username, password=password)
        if is_login is None:
            return JsonResponse({'code': 500, 'message': '账号或密码错误'})
    
        login(request, is_login)
        return JsonResponse(
            {
                'code': 200,
                'message': '登录成功',
            }
        )
    
    1. 注销方法
    def get_logout(request):
        data=  {
                "message": "登出成功!",
                "user":auth.get_user(request).get_username()
            }
        auth.logout(request)
        return JsonResponse(
          data
        )
    

    JWT 参考链接:https://zhuanlan.zhihu.com/p/258752405

  • 相关阅读:
    css3
    css3
    npm 安装包无法继续下载? 卡住
    tcp/ip协议中的SYN, ACK的数值变化
    【转】6 Reasons Why JavaScript’s Async/Await Blows Promises Away (Tutorial)
    ES6 中 Symbol.split的用法
    Why does Typescript use the keyword “export” to make classes and interfaces public?
    es6中的import,export浏览器已经支持
    Understanding the JavaScript Engine—— two phase
    【转】js-ES6学习笔记-Symbol
  • 原文地址:https://www.cnblogs.com/TianyuSu/p/15807676.html
Copyright © 2011-2022 走看看