Django Auth组件

文章目录


前言

Django 的用户认证组件基于以下几个核心概念:

1.用户认证:处理用户的登录、注销和密码管理,提供了一个User模型和相关的视图、表单和后台管理功能

2.权限和组管理:可以创建和管理用户权限(例如,查看、编辑、删除的权限),以及将用户分配到不同的组来简化权限管理

3.会话管理:自动处理用户的会话(即用户登录后的状态保持),确保用户在会话期间不需要重新登录

4.密码哈希:为用户密码提供安全的哈希处理,以防止明文密码存储

5.用户注册:提供了创建新用户的功能,通常通过自定义表单来实现

我们这里主要以登录注册相关为主


一、使用场景

Django 用户认证(Auth)组件一般用在用户的登录注册上,用于判断当前的用户是否合法,并跳转到登陆成功或失败页面

Django 用户认证(Auth)组件需要导入 auth 模块:

常用的功能和类:

User 模型:Django默认提供的用户模型,包含基本的用户信息字段(用户名、密码、邮箱等)

AuthenticationForm:用于处理用户登录的表单

UserCreationForm 和 UserChangeForm:用于处理用户注册和用户信息更新的表单

LoginView 和 LogoutView:处理用户登录和注销的视图

Permission 和 Group 模型:用于管理权限和用户组

二、使用步骤

1.验证用户( authenticate() 方法)

views.py新增方法(登陆验证)

bash 复制代码
def login(request):
    if request.method == 'GET':
        return render(request, 'login.html')
    else:
        username = request.POST.get('username')
        password = request.POST.get('password')
        user = auth.authenticate(username=username, password=password)
        if user is not None:
        	# 验证用户一般配合登陆用户一起使用,验证完用户可以通过login()登陆用户
            auth.login(request, user)
            return redirect('/index/')
        else:
            return render(request, 'login.html', {'error': '用户名或密码错误'})

路由:

bash 复制代码
path('login', views.login, name='login'),

templates下增加页面:

bash 复制代码
<Doctype html>
<html>
<head>
	<title>Login Page</title>
</head>
<body>
	<h1>Login Page</h1>
	<form method="post" action="">
		{% csrf_token %}
		<label for="username">Username:</label>
		<input type="text" id="username" name="username" required><br><br>
		<label for="password">Password:</label>
		<input type="password" id="password" name="password" required><br><br>
		<input type="submit" value="Login">
        <p>{{error}}</p>
	</form>
</body>

访问链接:http://127.0.0.1:8000/article/login

2.注册用户

创建用户对象的三种方法:

bash 复制代码
create():创建一个普通用户,密码是明文的
User.objects.create(username='test',password='123456')

create_user():创建一个普通用户,密码是密文的
User.objects.create_user(username='test',password='123456')

create_superuser():创建一个超级用户,密码是密文的,要多传一个邮箱 email 参数
User.objects.create_superuser(username='test',password='123456',email='test@qq.com')

3.退出登陆

使用 logout() 方法,需要清空session信息,将request.user赋值为匿名用户

bash 复制代码
def logout(request):
    user = auth.logout(request)
    return redirect("/login")

4.装饰器

目的:需要登录成功后才能访问的页面统一加装饰器

使用前导入from django.contrib.auth.decorators import login_required

定义方法:

bash 复制代码
from django.contrib.auth.decorators import login_required

@login_required
def index(request):
    return HttpResponse('hello world')

访问链接:http://127.0.0.1:8000/article/index会自动跳转到登陆页面

链接中?next=/article/index为用户登录成功后重定向的 URL

若用户一开始就访问登录页面 login,我们就需要自己设置这个next的url,不然request.GET.get("next") 获取不到值

bash 复制代码
# 如果直接访问login,get() 就取不到值,所以通过 or 自定义设置返回的页面
path = request.GET.get("next") or "/index/"
return redirect(path)
相关推荐
woshilys7 分钟前
sql server 查询对象的修改时间
运维·数据库·sqlserver
Hacker_LaoYi7 分钟前
SQL注入的那些面试题总结
数据库·sql
建投数据1 小时前
建投数据与腾讯云数据库TDSQL完成产品兼容性互认证
数据库·腾讯云
Hacker_LaoYi2 小时前
【渗透技术总结】SQL手工注入总结
数据库·sql
岁月变迁呀2 小时前
Redis梳理
数据库·redis·缓存
独行soc2 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
你的微笑,乱了夏天3 小时前
linux centos 7 安装 mongodb7
数据库·mongodb
工业甲酰苯胺3 小时前
分布式系统架构:服务容错
数据库·架构
独行soc4 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘
White_Mountain4 小时前
在Ubuntu中配置mysql,并允许外部访问数据库
数据库·mysql·ubuntu