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/')
posted @ 2019-12-05 20:23  GeminiMp  阅读(367)  评论(0编辑  收藏  举报