Django默认用户认证系统
- Django自带用户认证系统
- 它处理用户账号、组、权限以及基于cookie的用户会话。
- Django认证系统位置
- django.contrib.auth包含认证框架的核心和默认的模型。
- django.contrib.contenttypes是Django内容类型系统,它允许权限与你创建的模型关联。
- Django认证系统同时处理认证和授权
- 认证:验证一个用户是否它声称的那个人,可用于账号登录。
- 授权:授权决定一个通过了认证的用户被允许做什么。
- Django认证系统包含的内容
- 用户:用户模型类、用户认证。
- 权限:标识一个用户是否可以做一个特定的任务,MIS系统常 用到。
- 组:对多个具有相同权限的用户进行统一管理,MIS系统常用到。
- 密码:一个可配置的密码哈希系统,设置密码、密码校验。
以上都是官方的介绍字段,比较枯燥,可先跳过。
它可以做什么?
1. 当需要创建用户注册models时,不再需要自己设计复杂表结构
案例:以如下注册页面为例,我们需要的数据库字段有用户名、密码、手机号
-
使用Django自带的用户模型类,我们可以节省大量代码,实际定义代码如下:
from django.db import models from django.contrib.auth.models import AbstractUser class User(AbstractUser): mobile = models.CharField(max_length=11)
-
在settings中添加行
AUTH_USER_MODEL = '应用名.模型类名'
:# 指定本项目用户模型类 AUTH_USER_MODEL = 'users.User' # 应用名称.模型类名称
这里只是继承了AbstractUser类,并只自定义了一个手机号的字段,而其他字段都不需再定义和设计,就完成了我们需要的模型。
- 因为父类AbstractUser已经包含了username、password、email、first_name、last_name、last_login、date_joined、is_active 、is_staff、is_superuse这些字段,无需再次定义。
- username、password为必选字段,其余可选。
- 手机号字段Django中没有自带,需要我们继承AbstractUser并添加一条手机号字段即可。
2. 当需要在数据库中添加注册用户时,不再需要自己操作数据库语法
当用户通过注册验证后,创建用户对象只需执行下行代码:
user = User.objects.create_user(username=username, password=password, mobile=mobile)
3. 用户登录无需手动与数据库数据对比,无需对密码执行加密对比操作
from django.contrib.auth import authenticate
user = authenticate(username=username, password=password)
3.1 自定义authenticate方法实现多账号登录
实现能让用使用注册用户名、手机号或者邮箱完成登录验证:
在自定义工具目录util中继承ModelBackend
类,重写authenticate
方法
from django.contrib.auth.backends import ModelBackend
import re
from users.models import User
class MeiduoModelBackend(ModelBackend):
def authenticate(self, request, username=None, password=None, **kwargs):
try:
# get方法查询到数据返回用户对象,未查询到则报错
user = User.objects.get(username=username)
except:
try:
user = User.objects.get(mobile=username)
except:
return None
# 判断密码
if user.check_password(password):
return user
else:
return None
4. 保持用户登录状态无需手动创建session
from django.contrib.auth import login
login(request, user)
5.退出登录操作自动删除session
from django.contrib.auth import logout
logout(request)
迁移用户模型类
- 用户认证系统中的用户模型类,是通过全局配置项AUTH_USER_MODEL 决定的。
- 如果迁移自定义用户模型类,必须先配置 AUTH_USER_MODEL 。
- 设置自定义模型类后,必须完成迁移.
执行迁移命令:python manage.py makemigrations python manage.py migrate
迁移后,mysql数据库用户表结构如下: