Django之Auth模块
目录
Auth 模块是什么
Auth 模块是Django中自带的用户认证模块。
一个网站系统需要实现用户注册、用户登录、用户认证、注销、修改密码等功能,Django中内置了强大的认证系统-auth,默认使用auth_user表来存储用户的数据。
同时Django有一个后台管理系统(127.0.0.1:8000/admin),使用的用户名和密码也是这张数据表中的数据,
默认后台管理的用户名和密码是没有的,需要我们创建一个出来,而且只有超级管理员才能登录这个页面,那我们现在就来创建这样一个超级用户
扩展默认的auth_user表
在一个新的项目中,我们肯定是要先设计这个项目的数据库,表关系,Django系统内置的认证系统(auth_user表)很好用,但是表字段都是固定的几个,无法进行对它扩展。
比如,我想要加一个存储用户手机号的字段,怎么办?
现在我们就来设计扩展一下这个表,需要两步:
配置settings
需要我们在settings.py配置文件中增加一句话,
告诉Django使用新定义的Userinfo表来做用户认证的表
# 引用Django自带的User表,继承使用时需要设置。
AUTH_USER_MODEL = 'app01.Userinfo'
配置models
app01/models.py:
from django.db import models
# 导入AbstractBaseUser类,继承AbstractBaseUser类,基本字段
from django.contrib.auth.models import AbstractUser
# Create your models here.
class Userinfo(AbstractUser):
'''
扩展用户信息表
继承原有的auth_user表字段
'''
phone = models.CharField(max_length=11,null=True,unique=True)
def __str__(self):
return self.username
# 写完之后,后面所有需要保存至数据中的操作,以自己写的表为准
# from app01.models import Userinfo
一旦我们使用了新的认证系统所使用的表,我们就需要在数据库中创建该表,不能使用原来的auth_user表,原来的数据也会被清除。
最后,执行两条数据库迁移命令。
python3 manage.py makemigrations
python3 manage.py migrate
创建超级用户
默认后台管理的用户名和密码是没有的,需要我们创建一个出来,而且只有超级管理员才能登录这个页面,那我们现在就来创建这样一个超级用户
python3 manage.py createsuperuser
Username: admin
Email address: 123@qq.com
Password:
Password (again):
Superuser created successfully.
Auth 模块常用方法
创建用户
# 注册功能
# 创建普通用户,密码自动加密。
Userinfo.objects.create_user(username=username,password=password)
# 创建超级用户,密码自动加密,需要传邮件字段
Userinfo.objects.create_superuser(username=username,password=password,email='123@qq.com')
校验用户名和密码是否正确
# 登录功能
# 检验用户名和密码是否正确:登录,需要传入username和password两个字段,因为password对数据进行加密处理了。
user_obj = auth.authenticate(username=username,password=password)
if not user_obj:
return HttpResponse('用户不存在或密码错误')
else:
return HttpResponse('登录成功')
保存用户登录状态(session)
# 保存用户状态,相当于设置session值,
# 只要执行了此操作,后面的视图函数只要能够拿到request就可以通过request.user获取到当前的用户对象。
auth.login(request,user_obj)
判断当前用户是否登录
if not request.user.is_authenticated():
return redirect('/login/')
校验用户是否登录的装饰器
上面判断当前用户是否登录那种方式很复杂,需要再每个功能函数中写上这么一段,那么auth模块也帮我们提供了一个现成的登录认证装饰器:
from django.contrib.auth.decorators import login_required
# auth模块提供的登录装饰器提供两个配置:局部配置和全局配置
#局部配置
@login_required(login_url='/login/')
def home(request):
# if not request.user.is_authenticated():
# return redirect('/login/')
return HttpResponse('欢迎来到home页面')
# 全局配置:
# settings.py配置文件中配置:
LOGIN_URL = '/login/'
@login_required
def home(request):
# if not request.user.is_authenticated():
# return redirect('/login/')
return HttpResponse('欢迎来到home页面')
# 如果全局配置和局部配置都设置了,那么会以局部配置优先。
校验原密码并修改密码(修改密码)
# 校验原密码是否正确
if not request.user.check_password(old_password):
return HttpResponse('原密码不正确')
if confirm_new_password != new_password:
return HttpResponse('密码不一致')
# 设置新密码
request.user.set_password(new_password)
request.user.save()
return HttpResponse('密码修改成功')
注销
@login_required
def logout(request):
auth.logout(request)
return redirect('/login/')
auth全套用户认证例子
app01/views.py:
from django.shortcuts import render,HttpResponse,redirect
# Create your views here.
from app01.models import Userinfo
# 创建用户,注册
def register(request):
if request.method == "POST":
username = request.POST.get('username')
password = request.POST.get('password')
# 创建普通用户,密码自动加密。
Userinfo.objects.create_user(username=username,
password=password)
return HttpResponse('注册成功')
return render(request,'register.html')
from django.contrib import auth
# 检验用户名和密码是否正确:登录
def login(request):
if request.method == "POST":
username = request.POST.get('username')
password = request.POST.get('password')
user_obj = auth.authenticate(username=username,
password=password)
if not user_obj:
return HttpResponse('用户不存在或密码错误')
else:
auth.login(request,user_obj)
return HttpResponse('登录成功')
return render(request,'login.html')
from django.contrib.auth.decorators import login_required
# auth模块提供的登录装饰器提供两个配置:局部配置和全局配置
#局部配置
@login_required(login_url='/login/')
def home(request):
# if not request.user.is_authenticated():
# return redirect('/login/')
return HttpResponse('欢迎来到home页面')
@login_required
def change_password(request):
if request.method == "POST":
old_password = request.POST.get('old_password')
new_password = request.POST.get('new_password')
confirm_new_password = request.POST.get('confirm_new_password')
# 校验原密码是否正确
if not request.user.check_password(old_password):
return HttpResponse('原密码不正确')
if confirm_new_password != new_password:
return HttpResponse('密码不一致')
# 设置新密码
request.user.set_password(new_password)
request.user.save()
return HttpResponse('密码修改成功')
return render(request,'change_password.html')
@login_required
def logout(request):
auth.logout(request)
return redirect('/login/')