auth认证模块及相关操作,扩展auth_user表
auth认证模块
在刚学习django的时候我们发现django自带一个admin路由,但是需要我们提供管理员账号和密码,接下去学习的过程中,我们又发现数据库迁移后创建了十多张新的表,大部分我们都没有研究,其中的一张表就是专门用来配合Auth模块做用户的登录、校验用户是否登录、修改密码、注销登录等功能的。
如果想要使用admin后台管理,需要先创建表,然后创建管理员账号。
直接执行数据库迁移命令即可产生默认的auth_user表,该表就是admin后台管理默认的认证表。
创建超级管理员的命令
python38 manage.py createsuperuser
基于auth_user表编写用户相关的各项功能
- 登录、校验用户是否登录、修改密码、注销登录等都是在这张表完成的。
auth认证相关模块及操作
功能及方法介绍
auth封装了很多方法,它让我们不需要自己编写逻辑判断用户信息是否正确(不止这个一个功能哦)。
字段 | 释义 |
id | ID |
password | 密码 |
last_login | 最后登录时间 |
is_superuser | 是否是管理员 |
username | 用户名 |
first_name | 姓 |
last_name | 名 |
邮箱 | |
is_staff | 是否是工作人员 |
is_active | 是否激活 |
date_joined | 创建时间 |
导入auth模块
from django.contrib import auth
在执行auth模块相关操作前要先导入数据库中的表
from django.contrib.auth.models import User
用户注册功能(即用户创建)
User.objects.create_user(username=username, password=password)
常用方法介绍
判断用户名和密码是否正确
from django.contrib.auth.models import User 1.普通用户 user = User.objects.create_user(username='用户名',password='密码',...) 2.管理员用户,必须要有email user = User.object.create_superuser(username='用户名',password='密码',email='邮箱',...)
判断用户是否登录
request.user.is_authenticated # 如果登陆了,结果为布尔值Ture,否则为False
获取登录用户对象数据
request.user # 用户信息可以在user中用点的方式获取
校验用户是否登录装饰器
from django.contrib.auth.decorators import login_required # 我们如果不指定这里的url,就不会跳转到我们制作的登陆页面. @login_required(login_url='/login/') 局部配置 @login_required 全局配置 # 配置文件:LOGIN_URL = '/login/' # 配置文件中修改,会让全局的@login_required影响下的视图函数/类全都跳转向一个页面
校验原密码是否正确
request.user.check_password(原密码)
修改密码
request.user.set_password(新密码)
request.user.save()
退出登录
auth.logout(request)
部分功能操作代码展示
'''判断当前用户有没有登录操作''' html <form method="post"> {% csrf_token %} <p>username:<input type="text" name="username"></p> <p>password:<input type="text" name="password"></p> <input type="submit"> </form> views def login(request): print(request.user) ''' 用户登录成功之后执行Auth.login 该方法返回当前登录用户对象 admin 用户没有登录成功没有执行Auth.login 该方法返回匿名用户对象 AnonymousUser ''' print(request.user.is_authenticated) # 判断当前用户是否登录 返回True False if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') # 现在遇到一个问题就是怎么通过models.的方式去操作auth_user表格呢? 这个时候就有auth模块了 res = auth.authenticate(request, username=username, password=password) # print(res.username, res.password, # res.pk) # admin pbkdf2_sha256$150000$4NZp3wuIgf9A$7hfw7pcm35QosjTRWFpj9U3F5SoGTRqUv/H8DpBp308= 2 '''数据正确的情况下会有一个返回值是数据对象 数据错误的情况下返回的是None''' if res: auth.login(request, res) # 自动操作Cookie与Session return render(request, 'login.html') ''' 用户登录装饰器 当用户没有登录的情况下跳转到注册界面 在settings文件中设置跳转的页面地址 LOGIN_URL = '/login/' ''' from django.contrib.auth.decorators import login_required @login_required def index(request): return HttpResponse('Form index view') @login_required def func(request): return HttpResponse('Form func view') '''重置密码''' views @login_required def set_password(request): if request.method == 'POST': old_password = request.POST.get('old_password') new_password = request.POST.get('new_password') '''校验原密码是否正确 自定加密并检验''' is_right = request.user.check_password(old_password) if is_right: request.user.set_password(new_password) # 修改密码 request.user.save() # 保存数据 return render(request, 'set_password.html') html <form action="" method="post"> {% csrf_token %} <p>old_password:<input type="text" name=""></p> <p>new_password:<input type="text" name=""></p> <input type="submit"> </form> '''自动清除Cookie与Session''' views @login_required def loginout(request): auth.logout(request) # 自动清楚cookie和Session return HttpResponse('清除成功!!!') '''创建用户''' views from django.contrib.auth.models import User def register(request): User.objects.create(username='Like', password=123, email='120@qq.com') # 这里创建的是普通用户 不能登录管理员系统 return HttpResponse('注册成功!!!')
扩展auth_user表
如果我们既想使用auth模块的功能,并且又想扩展auth_user表的字段,有以下两种方式:
思路1:一对一字段关联
因为操作相对繁琐,不建议使用.
思路2:替换auth_user表
我们点进调入的User表查看源码,我们发现他只是继承了AbstractUser模块,然后点进AbstractUser源码,我们发现他就相当于一张模型表,配置了auth需要使用的表的具体内容.因此我们可以自己定义一个模型表,只要导入父类AbstractUser即可自定义功能.
操作简单,推荐使用.
步骤1:模型层编写模型类继承AbstractUser from django.contrib.auth.models import AbstractUser class UserInfo(AbstractUser): # 填写AbstractUser表中没有的字段 phone = models.BigIntegerField() desc = models.TextField() 步骤2:一定要在配置文件中声明替换关系(把表替换成我们自定义的模型表) AUTH_USER_MODEL = 'app01.UserInfo' ps:替换还有一个前提,就是数据库迁移没有执行过(auth相关表没有创建)