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自带的用户系统)