auth认证模块

auth认证模块

auth认证前瞻

django自带一个admin路由,但是需要我们提供管理员账号和密码。
如果想要使用admin后台管理,需要先创建表,然后创建管理员账号。

image

不用手写模型表,django直接执行两条迁移指令后就会直接产生相关的表,可以理解为django为我们默认编写了很多模型表,其中有一部分就是关于auth认证的表。

我们的auth_user表就存放着用户数据,也默认有很多字段:

image

有些字段的含义如下:

  • 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相关表,需要删除后重新迁移以防报错

posted @ 2022-12-23 18:01  leethon  阅读(191)  评论(0编辑  收藏  举报