0
点赞
收藏
分享

微信扫一扫

SpringBoot集成WebSocket

君心浅语 2023-09-02 阅读 53

文章目录

一、用户认证系统

表名作用
auth_user用户表
auth_user_groups用户所属组的表
auth_user_user_permissions用户权限表
auth_group用户组表
auth_group_permissions用户组权限表
auth_permission存放全部权限的表,其他的表的权限都是从此表中外键连接过去的
django_session保存HTTP状态
django_migrations数据库迁移记录

二、案例:登陆认证

2.1 平台登入

1.登陆成功,进入平台首页;登陆失败,返回错误信息。

###################################################
1、定义url路由规则,ORM/urls.py文件。
from django.contrib import admin
from django.urls import path,include,re_path
from ORM import views
urlpatterns = [
    path('admin/', admin.site.urls),
    re_path('^$',views.home),
    path('myapp/',include('myapp.urls')),
    path('login/',views.login)
]
###################################################
2、定义视图,ORM/views.py文件。
from django.shortcuts import render,HttpResponse,redirect
from django.contrib import auth
def home(request):
    return render(request,'index.html')
def login(request):
    if request.method == "GET":
        return render(request, 'login.html')
    elif request.method == "POST":
        username = request.POST.get('username')
        password = request.POST.get('password')
        user = auth.authenticate(username=username, password=password)
        if user:
            ##验证通过后,将session信息保存到数据库中。
            auth.login(request, user)   
            return redirect("/")
        else:
            msg = "用户名或密码错误!"
            return render(request,'login.html',{'msg':msg})
###################################################
3、定义html模板,templates/login.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>管理后台页面</title>
</head>
<body>
<ht>欢迎访问管理后台</ht>
<form action="" method="post">
    用户名 : <input type="text" name="username"><br>
    密码 : <input type="text" name="password"><br>
    <button type="submit">登录</button>
    <span style="color: red">{{ msg }}</span>
</form>
</body>
</html>
###################################################
4、平台首页渲染模板templates/index.html,新增”退出登录“按钮。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>平台首页</title>
</head>
<body>
<h1>网站首页</h1>
<a href="/logout"><button>退出登录</button></a>
</body>
</html>

2.进入django管理后台,新增一个测试用户xiaoming,添加auth权限。
在这里插入图片描述
3.测试效果。
在这里插入图片描述
在这里插入图片描述

2.2 平台登出

1.退出登录,返回到登陆页面。

###################################################
1、定义url路由规则,ORM/urls.py文件。
from django.contrib import admin
from django.urls import path,include,re_path
from ORM import views
urlpatterns = [
    path('admin/', admin.site.urls),
    re_path('^$',views.home),
    path('myapp/',include('myapp.urls')),
    path('login/',views.login),
    path('logout/',views.logout),   ##新增url
]
###################################################
2、新增视图,ORM/views.py文件。
def logout(request):
    # 清除当前用户的session信息
    auth.logout(request)
    return redirect('/login')

2.3 login_required装饰器

1.在settings.py文件设置没有登录默认跳转页面。

##文件末尾添加。
LOGIN_URL = '/login/'

2.在需要登录后才能访问页面的视图添加装饰器。

from django.contrib.auth.decorators import login_required

@login_required()    ##语法糖引用装饰器。
def user_add(request):
      ......
      ......

3.效果验证。
在这里插入图片描述

三、Django Session管理

3.1 Django使用Session

3.1.1 Cookie用法

参数描述
SESSION_COOKIE_NAME = “sessionid”Session的cookie保存在浏览器上时的key
即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = “/”Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = NoneSession的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False是否每次请求都保存Session,默认修改之后才保存(默认)

1.设置Cookie过期时间,单位s。

##ORM/settings.py文件末尾添加此行。
SESSION_COOKIE_AGE = 30*60

在这里插入图片描述

2.设置关闭浏览器使得Session过期。

##ORM/settings.py文件末尾添加此行。
SESSION_EXPIRE_AT_BROWSER_CLOSE = True

在这里插入图片描述

3.1.2 Session用法

参数描述
request.session[‘key’] = value向Session写入键值
request.session.get(‘key’,None)获取Session中键的值
request.session.flush()清除Session数据
request.session.set_expiry(value)Session过期时间

1.自定义向Session写入键值,前端可以拿到该value值。
在这里插入图片描述
在这里插入图片描述

3.2 案例:用户登录认证

1.自己实现登陆验证功能。

############################################################################
##根据上文内容,将login接口试图修改成如下内容。
def login(request):
    if request.method == "GET":
        return render(request, 'login.html')
    elif request.method == "POST":
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username =="qingjun" and password == "citms@123":
            #登录成功,is_login设置为True
            request.session['is_login'] = True  
            request.session[ 'username'] = username   #保存用户名到数据库。
            return redirect("/")
        else:
            msg ="用户名或密码错误 !"
            return render(request,'login.html',{'msg': msg})

############################################################################
1、定义装饰器,可以给其他视图引用,新增文件ORM/main.py。
from django.shortcuts import render,HttpResponse,redirect
def self_login_required(func):
    def inner(request):
        is_login = request.session.get('is_login', False)
        if is_login:
            return func(request)
        else:
            return redirect("/login")
    return inner
############################################################################
2、引用装饰器。
from ORM.main import self_login_required
@self_login_required
def home(request):
    return render(request, 'index.html')

2.查看效果。
在这里插入图片描述

四、Django CSRF安全防护机制

1.Django默认启用CSRF保护机制,当有post请求时,就会被拦截。
在这里插入图片描述
2.此时可以给html模板中添加csrf标签,浏览器可以其值与表单一起提交给服务端。
在这里插入图片描述
在这里插入图片描述
3.还有其他两种方式。

##########################################################
方式2,不建议使用,建议在html模板中添加标签方式返回。
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def index(request):
return render(request, 'index.html')
##########################################################
var csrf_token = $("[name='csrfmiddlewaretoken']").val();
var data = {'id': '123', 'csrfmiddlewaretoken': csrf_token};
$.ajax({
	type: "POST",
	url: "/api",
	data: data,
	dataType: 'json'
})
举报

相关推荐

0 条评论