django自带的用户系统

一、介绍

基本上在任何网站上,都无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能。
使用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"})

猜你喜欢

转载自blog.csdn.net/weixin_46237597/article/details/113124797