auth认证模块 auth_user表扩展
auth认证模块前戏
django后台管理功能
前戏:django自带一个admin路由 但是需要我们提供管理员账号和密码
如果想要使用admin后台管理 需要先创建表 然后创建管理员账号
直接执行数据库迁移命令即可产生默认的auth_user表 该表就是admin后台管理默认的认证表
1.创建超级管理员
python38 manage.py createsuperuser
基于auth_user表编写用户相关的各项功能
登录、校验用户是否登录、修改密码、注销登录等
第一次迁移数据库之后会自动创建auth_user表:
该表就是admin后台管理默认的认证表
创建超级管理员
python38 manage.py createsuperuser
示例:
创建完之后查看auth_user表:
1表示该用户是超级管理员。
管理员的密码经过了加密。
使用该账号登录django后台管理:
不仅可以创建超级管理员,还可以创建普通用户。
只不过使用终端只允许你创建超级管理员,只能用业务逻辑的形式创建普通用户。
auth认证相关模块及操作
from django.contrib import auth
from django.contrib.auth.models import User
1.用户注册功能
User.objects.create_user(username=username, password=password)
2.判断用户名和密码是否正确
user_obj = auth.authenticate(request,
username=username,
password=password)
3.判断用户是否登录
request.user.is_authenticated
4.获取登录用户对象数据
request.user
5.校验用户是否登录装饰器
from django.contrib.auth.decorators import login_required
@login_required(login_url='/login/') 局部配置
@login_required 全局配置
配置文件中LOGIN_URL = '/login/'
6.校验原密码是否正确
request.user.check_password(原密码)
7.修改密码
request.user.set_password(新密码)
request.user.save()
8.退出登录
auth.logout(request)
用户注册
前端页面:
视图函数:
先导入auth模块,使用auth.authenticate
方法
这里是只传入了用户名。必须要传入用户名和密码。
导入auth_user表:
使用create方法注册用户:
查看auth_user表:
此时密码没有进行加密。
使用create_user方法:
会对密码进行加密:
用户登录
登录时,用户输入的是密码明文,而我们的auth_user表存储的是加密的密码,所以无法进行正常比对,需要经过auth模块的方法比对:
当用户名和密码输入正确时,auth.authenticate
方法会返回用户对象,输入不正确时返回None:
登录成功后,给客户端返回加密字符串:
auth.login
: 会自动去django_session表里创建一个键值对,然后把用户对象存在这个表里面,最后返回给前端浏览器一个加密字符串。
查看session表:
request.user获取当前登录的用户对象数据:
对于没有登录的用户:
request.user会拿到匿名用户。
网站首页效果
需求:已经登录的用户,显示用户的名字。用户未登录,显示登录注册。
判断当前用户对象是否已登录:
这个方法可以判断当前的请求是否已经登录。
前端页面:
校验用户登录的装饰器
示例:
被login_required装饰的函数,只有登录的用户(携带cookies)才能查看。
没有登录的用户,访问会跳转到登录页面:
只不过这个登录页面的路由,是别人写好的,但是我们也可以自定义这个路由。
控制跳转的路由:
可以让不同的视图函数跳转到不同的页面。
当视图函数特别多的情况下:
login_url='/login/'
这行代码会反复写。还可以进行优化。
可以在setting文件中,写一个全局配置:
![image-20221225233603577](https://img2023.cnblogs.com/blog/2614258/202212/2614258-20221226225447057-390260767.png)
这里的意思是:如果使用login_required装饰视图函数不指定跳转的路由,就使用配置文件中指定的路由LOGIN_URL
。
如果全局和局部都指定了路由,那么会跳转到哪个路由?
这种情况下会跳转到局部指定的路由。
用户修改密码
视图函数:
登录的用户才能修改密码。
前端页面:
视图函数:
获取到的原密码是明文的,auth_user表里存储的密码是密文的,我们无法比较。此时用户已经登录,所以我们可以用request.user拿到用户数据对象。
使用request.user对象的方法校验密码:
用户注销登录
视图函数:
会自动把浏览器存储的cookies、auth表里存储的用户数据删除。
auth_user表扩展
还想使用auth模块的功能 并且又想扩展auth_user表的字段
思路1:一对一字段关联
思路2:替换auth_user表
步骤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相关表没有创建)
问题:我们想使用django生成的auth_user表,但是又觉得这个表的字段不够多。
如何给auth_user表扩展更多的字段?
思路1:一对一字段关联
在model再建模型表:
我们的表的数据和auth_user表的数据一一对应。
思路2:替换auth_user表(重要)
首先在模型层导入真正的auth_user表:
我们之前导入的User,继承于AbstractUser。
所以我们写一个模型类,继承于AbstractUser:
所以我们可以在继承了auth_user表的基础上,进行扩展。
注意不要填写已有的字段,会冲突。
注意:一旦我们写了一个模型类,继承了AbstractUser,就相当于要替换django自动生成的auth_user表,取而代之的是我们的表(userinfo)
想这么做的话,要确保我们没有执行过数据库迁移命令,必须保证使用的是一个全新的库。不可以使用已经产生过auth_user表的数据库。
并且还要在配置文件中加一句话:
示例:
之后所有基于auth_user表的操作,都会使用我们创建的这张表。
练习
1.利用auth模块编写一个网站导航条相关的功能(用自己创建的表)
也可以直接在图书管理系统中切入用户相关的功能
导航条右侧 用户没有登录现实 登录 和 注册
用户登录之后 现实当前用户名及登录之后的一些操作 修改密码 退出登录