一、介绍
基本上在任何网站上,都无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能。
使用Django,我们可以不需要自己写这些功能,因为Django内置了强大的用户认证系统–auth,它默认使用 auth_user 表来存储用户数据。
from django.contrib import auth # 使用auth认证系统
from django.contrib.auth.models import User # auth认证系统默认使用User表
注意:命令行创建超级用户 python manage.py createsuperuser
二、authenticate()
提供了用户认证功能,即验证用户名以及密码是否正确,一般需要username 、password两个关键字参数。
如果认证成功(用户名和密码正确有效),便会返回一个 User 对象。
authenticate()会在该 User 对象上设置一个属性(id)来标识后端已经认证了该用户,且该信息在后续的登录过程中是需要的。
用法:
from django.contrib import auth
# 继承的AbstractUser类 密码必须是手动加密的 保存
user_obj = auth.authenticate(username=username,password=pwd)
三、login(request, user)
该函数接受一个HttpRequest对象,以及一个经过认证的User对象。
该函数实现一个用户登录的功能。它本质上会在后端为该用户生成相关session数据。
用法:
from django.contrib.auth import authenticate, login
def my_view(request):
username = request.POST['username']
password = request.POST['password']
user_obj = authenticate(username=username, password=password)
if user_obj:
login(request, user_obj)
# Redirect to a success page.
...
else:
# Return an 'invalid login' error message.
...
注意:
只要使用login(request, user_obj)之后,request.user就能拿到当前登录的用户对象。否则request.user得到的是一个匿名用户对象(AnonymousUser Object)。
详细原理请查看 AuthenticationMiddleware 中间件源码。
重写(自定义)登录验证后端authenticate()
class UserModelBackend(ModelBackend):
"""
多方式登录
"""
def authenticate(self, request, username=None, password=None, **kwargs):
try:
user_obj = User.objects.get(Q(username=username) | Q(phone=username))
except User.DoesNotExist:
pass
else:
if user_obj is not None and user_obj.check_password(password):
return user_obj
# 最后要告知django,自定义的类,在setting.py中配置
AUTHENTICATION_BACKENDS = ["app01.views.UserModelBackend"]
使用该系统有什么优势?
缩减你的代码量,提高效率!
方便我们使用django的jwt操作
django自带的用户系统是为了(验证登录的逻辑)而JWT是(用户状态保持的手段)
登陆的时候如何扩充其登陆方式
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.hashers import make_password, check_password
class UserModelBackend(ModelBackend):
"""
多方式登录
"""
def authenticate(self, request, username=None, password=None, **kwargs):
try:
user_obj = User.objects.get(Q(username=username) | Q(phone=username))
except User.DoesNotExist:
pass
else:
if user_obj is not None and user_obj.check_password(password):
return user_obj
# 在setting.py告知django用户自定义的类
AUTHENTICATION_BACKENDS = ["app01.views.UserModelBackend"] # app名.views.类名
使用DRF做权限校验的时候,如何扩充权限类别
from rest_framework.permissions import AllowAny,IsAuthenticated,IsAdminUser
"""
drf框架为我们提供了基本的权限验证。主要包括三种验证
AllowAny 所有用户
IsAuthenticated 验证过的用户
IsAdminUser 超级管理员
"""
# 创建一个权限.py里面可以自定义权限类,
class VIP(BasePermission):
"""
自定义权限类
"""
message = 'VIP可以访问 '
def has_permission(self, request, view):
if request.user.id != 1:
return False
return True
class VIPView(APIView):
permission_classes = [VIP] # 可以增加多个权限
def get(self, request):
return Response({
"msg": "OK"})