auth认证模块
auth认证前瞻
django自带一个admin路由,但是需要我们提供管理员账号和密码。
如果想要使用admin后台管理,需要先创建表,然后创建管理员账号。
不用手写模型表,django直接执行两条迁移指令后就会直接产生相关的表,可以理解为django为我们默认编写了很多模型表,其中有一部分就是关于auth认证的表。
我们的auth_user表就存放着用户数据,也默认有很多字段:
有些字段的含义如下:
- password:密文的密码
- last_login:上次登录时间
- is_superuser:是管理员就存1,普通用户就存0
- username:用户名
- data_joined:注册时间
这些字段只是django默认提供的,并且django也提供了很多周边的方法来处理这些字段数据
围绕这些表所做的操作叫做auth操作,有命令形式的和代码形式的。
命令形式我们可以先掌握,如何创建管理员:
python manage.py createsuperuser
在执行创建管理员命令后,运行环境会提示我们输入用户名,邮箱(选填),密码等信息,依次输入即可。这样我们的auth_user表中就会添加一条数据,这条数据就是管理员用户信息。
auth操作
在进行auth操作之前我们需要
- 导入user的模型类:
from django.contrib.auth.models import User
- 导入auth模块:
from django.contrib import auth
用户注册功能
User.objects.create_user(username=username, password=password)
用户注册功能需要传入至少username和password两个参数
在执行这条语句时会自动帮我们校验用户是否存在,密码加密等操作
登录与保存登录态
登录校验:
username = request.POST.get('username')
password = request.POST.get('password')
user_obj = auth.authenticate(request, # 传入request
username=username,
password=password)
虽然拿到User模型表,按道理可以直接通过筛选字段数据进行校验,但是要注意,关于所有的密码操作,需要User表封装好的方法去加密,这里的密码校验也需要我们加密。
这个方法的返回值user_obj是一个用户对象或者None,这个对象有值则我们让其保存用户状态(cookie,session各存一份),没有值则登录失败。
if user_obj:
auth.login(request, user_obj) # 保存用户登录状态,user_obj存session本地
登录认证装饰器
登录认证装饰器自带路由记忆功能,即登录成功后会返回跳转登录前的界面。
登录认证装饰器默认有一个登录路由,但是并没有对应具体界面,我们可以在settings配置登录界面的路由,也可以将装饰器做有参装饰器传入登录界面路由
局部配置:
from django.contrib.auth.decorators import login_required
@login_required(login_url='/login/') # 局部配置
def func(request):pass
全局配置:
配置文件中LOGIN_URL = '/login/'
@login_required # 全局配置
def func(request):pass
其他登录状态相关
-
判断用户是否登录:
request.user.is_authenticated
返回bool值 -
获取登录用户对象数据:
request.user
如果用户是登录态,那么这个值就是对应的user_obj,如果校验发现没有用户,那么这个值就是Anonymous。
-
校验原密码是否正确:
request.user.check_password(原密码)
注意,在执行这句时一定确保request.user为具体的用户对象,而不是匿名用户
-
修改密码:
request.user.set_password(新密码) request.user.save()
-
登出账号:
auth.logout(request)
本质上将浏览器的cookie和服务器的session对应记录都删除了。
auth操作参照表
auth操作或User表操作 | 作用 |
---|---|
User.objects.create_user(username=username, password=password) |
注册用户 |
user_obj = auth.authenticate(request, username=username, password=password) |
登录用户 并返回用户对象 |
auth.login(request, user_obj) | 保存用户登录态 |
auth.logout(request) | 注销用户登录态 |
@login_required(login_url='/login/') | 登录态认证装饰器 |
request.user.is_authenticated | 是否有用户登录态 |
request.user | 用户对象 (无登录则匿名) |
request.user.check_password(原密码) | 校验用户对象密码 |
request.user.set_password(新密码) request.user.save() |
设置新密码并保存 |
扩展auth_user表
django提供给我们的auth模块固然很好用,但是auth_user表中的字段定死了,显然无法满足我们的业务需求,实际上考虑到这个,我们也可以对auth_user进行改造。
查看源码,User模型类实际上里面什么都没写,而是继承了AbstractUser,这个模型类中定义了我们上文提到的字段。所以我们想要拓展表,只需要继承AbstractUser创建一个模型表,添加我们想要添加的字段即可。
编写auth模型类
from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
# 填写AbstractUser表中没有的字段
phone = models.BigIntegerField()
desc = models.TextField()
注意,这里编写的模型类就不要直接继承Model类了,而是继承AbstractUser。
注册auth模型类
在settings.py中配置:
AUTH_USER_MODEL = 'app01.UserInfo'
以上两步配置好后,执行迁移命令即可生成我们的自己编写的auth表。
注:如果已经迁移生成过auth相关表,需要删除后重新迁移以防报错
标签:登录,request,auth,认证,user,模块,login,password From: https://www.cnblogs.com/Leethon-lizhilog/p/17001284.html