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',
]
最后需要解决接口的认证问题。
有两种方法:
- 使用 Django 的 Seesion 来管理,配合 admin 自带的 User 类
- 使用 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
- 不需要登录 get 的方法
def get_info_noAuth(request):
data = 'some info without auth'
return JsonResponse(
{
'code': 200,
'message': '请求成功',
'data': data
}
)
- 需要登录的 post 方法,可以利用
@login_required()
装饰器解决
@login_required()
def get_info(request):
data = 'some info'
return JsonResponse(
{
'code': 200,
'message': '请求成功',
'data': data
}
)
- 登录方法
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': '登录成功',
}
)
- 注销方法
def get_logout(request):
data= {
"message": "登出成功!",
"user":auth.get_user(request).get_username()
}
auth.logout(request)
return JsonResponse(
data
)