一.Auth模块是什么
我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能,这还真是个麻烦的事情呢。
Django作为一个完美主义者的终极框架,当然也会想到用户的这些痛点。它内置了强大的用户认证系统--auth,它默认使用 auth_user 表来存储用户数据。
执行数据库迁移命令之后,会生成很多表,其中的auth_user是一张用户相关的表格
其他补充:
# createsuperuser 创建超级用户 这个超级用户就可以拥有登陆django admin后台管理的权限
二.Auth模块的使用
from django.contrib import auth
<1> authenticate() 验证方法
1.提供了用户认证功能,即验证用户名以及密码是否正确,一般需要username 、password两个关键字参数。(会将password参数转为密文与auth_user表中的密码校验)
2.如果认证成功(用户名和密码正确有效),便会返回一个 User 对象,若不成功返回None
user_obj = auth.authenticate(username=username,password=password) # 必须要用auth.authenticate 因为数据库中的密码字段是密文的 而你获取的用户输入的是明文 print(user_obj) # 返回的就是用户对象 print(user_obj.username) # 用户名 print(user_obj.password) # 密文密码
<2> login() 登录状态方法
1.该函数接受一个HttpRequest对象,以及一个经过authenticate认证的User对象。
2.将用户状态记录到session中,并返回到前端浏览器中
auth.login(request,user_obj) # 将用户状态记录到session中 # 类似 request.session['user'] = user_obj """ 只要执行了这一句话,你就可以在前后端任意位置通过request.user获取到当前用户对象 """
补充 匿名用户:
def foo(request): print(request.user) # AnonymousUser 如果没有执行auth.login那么拿到的是匿名用户 return HttpResponse('foo')
<3> is_authenticated() 判断是否登录方法
print(request.user.is_authenticated) # 判断用户是否登录,返回bool值,只有执行了auth.login才为True
<4> login_required 登录装饰器
from django.contrib.auth.decorators import login_required
(1)局部配置
@login_required(login_url='/login/') # login_url参数 从定向到login页面(若用户没有登录测重定向到 /login/ ) def func(request): return HttpResponse('func')
(2)全局配置
在settings文件中: LOGIN_URL = '/login/' # 若没登录则从定向到login页面 @login_required def func(request): return HttpResponse('func')
<5> logout() 退出登录方法
1.该函数接受一个HttpRequest对象,无返回值。
2.当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。
def logout(request): auth.logout(request) # 类似 request.session.flush() return HttpResponse('logout')
<6> check_password() 查看密码方法
# 获取用户密码自动加密,去数据库校验当前用户的密码是否一致 is_right = request.user.check_password(password) # 返回bool值
<7> set_password() 修改密码方法
request.user.set_password(new_password) request.user.save() # 修改密码的一定要save方法保存,否则无效
<8> create_user() 与 create_superuser()
auth 提供的一个创建新的普通用户和超级用户的方法,需要提供必要参数(username、password)等。
from django.contrib.auth.models import User User.objects.create_user(username='用户名',password='密码',email='邮箱',...) User.objects.create_superuser(username='用户名',password='密码',email='邮箱',...)
补充:
扩展默认的auth_user表(自定义auth_user表)
from django.contrib.auth.models import AbstractUser
<第一步> 在models.py文件中创建自定义表
from django.contrib.auth.models import AbstractUser # 扩展anth_user表的方法 使用类的继承 class Userinfo(AbstractUser): # 新增加的字段不要和原来的auth_user表中的字段冲突 phone = models.BigIntegerField() avatar = models.CharField(max_length=32)
<第二步> 在settings.py文件中
# 告诉django orm不再使用auth默认的表 而是使用你自定义的表 AUTH_USER_MODEL = 'app01.Userinfo' # '应用名.类名'
<第三步> 配置MySQL数据库, 执行数据库迁移命令
补充:执行数据库迁移命令后 所有的auth模块功能 全部都基于你创建的表 而不再使用auth_user