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

posted @ 2022-01-15 21:12  佰大于  阅读(67)  评论(0编辑  收藏  举报