authenticate()用户认证系统学习笔记
-
什么是用户认证
- 是Django自带的用户认证后端,默认是使用用户名实现用户认证
-
用户认证后端位置:
django.contrib.auth.backends.ModelBackend
-
authenticate()有什么用
- 用于认证用户名是否存在数据库中;通常用于:登录认证
- 还可以自定义用户认证:例如:使用用户名和手机号来认证用户
-
怎样使用
- 1、导入authenticate包:
from django.contrib.auth import authenticate
- 2、直接调用:
user=authenticate(username=username,password)
- 1、导入authenticate包:
-
自定义后端认证步骤:
- 在user应用中创建lib.py文件
- 在lib.py文件中创建一个类,并继承ModelBankend
- 重写authenticate()方法
- 分别使用用户名和手机号来查询用户
- 返回查询到的用户实例
-
个人认为它的好处,并且它的认证功能比较安全可靠:
- 防止在验证过程中出现异常
- 使用起来比普通认证逻辑要省时省事
-
在没有使用自带的认证的情况下,个人普通认证逻辑:
### 这里演示登录认证用户是否已注册 #1、首先导入用户模型类包(根据自己的结构来导入) #2、尝试从User模型类中连接用户表数据库 try: user=User.objects.get(username=username) except: #3、如果抛出异常,则说明没有该用户名 return http.HttpResponseServerError("用户名或密码不正确") #4、如果能够查询出有该用户名,则校验用户的密码是否正确 if not user.check_password(password=password) return http.HttpResponseServerError("用户名或密码不正确") else: #5、验证都通过,则状态保持登录,使用Django自带的login()方法 from django.contrib.auth import login() login(request,user) #6、设置session的过期时间,因为login()使用的是cookie-session机制来进行做状态保持 #7、如果没有勾选记住密码,则在浏览器会话结束就删除该用户的session信息 if not allow: request.session.set_expiry(0) #使用request对象的session中的set_expiry()方法来实现,0:表示结束会话后立刻删除session信息 #8、如果有勾选记住密码,则在浏览器中设置一个保存session的时间 else: request.session.set_expiry(None) #None:表示会话结束后的2周时间后就删除session信息 #9、登录成功后重定向到首页 return redirect('/')
-
使用Django自带的认证系统的情况下:
#1、导入Django自带的authenticate方法 from django.contrib.auth import login, authenticate #2、直接使用用户认证(这一步之前,需要提前校验前端传入过来的数据格式要求是否达标) user=authenticate(username=username,password=password) #3、如果认证失败就会返回None,认证成功就会返回User对象,则判断user是否为None,如果不是则 用户是以注册的用户。 if user is None: return http.HttpResponseServerError("用户名或密码不正确") else: #4、认证通过,则执行状态保持进行登录 login(request,user)