天天看点

django的创建用户、用户登陆、用户登出、用户修改密码、单点登陆的实现

创建用户

from django.contrib.auth.models import AbstractUser as User

User.objects.create_user(username=username, password=password)
           

用户登录

from django.contrib import auth

user = auth.authenticate(username=username, password=password)  # 校验用户密码
if user:  # 如果密码正确
    auth.login(request, user)  # 设置cookie和session,使用户进入登陆状态

# 如果用户登陆时不用校验密码,比如短信验证码登陆,则需要判断用户是否激活,使用user_can_authenticate检查用户的is_active属性判断用户是否激活
if auth.get_backends()[0].user_can_authenticate(user):
    auth.login(request, user)
           

用户登出

from django.contrib import auth

auth.logout(request)
           

修改密码

django的密码使用pbkdf2_sha256加密,无法逆向解密,默认不存储原始密码,所以修改密码不能直接修改,需要使用User的set_password方法,或者使用make_password生成加密后的密码再直接修改。

错误方式:

User.objects.filter(userid=userid).update(password=password)
# 或者
user = User.objects.filter(userid=userid).first()
user.password = password
user.save()
           

正确方式:

from django.contrib.auth.hashers import make_password

User.objects.filter(userid=userid).update(password=make_password(password))
# 或者
user = User.objects.filter(userid=userid).first()
user.set_password(password)
           

单点登陆的实现

pbkdf2_sha256加密时相同密码每次加密的结果都不同,单点登陆的实现利用了这一特性。

自定义用户模型,增加存储原始密码的字段:

from django.db import models
from django.contrib.auth.models import AbstractUser, UnicodeUsernameValidator


class User(AbstractUser):
    real_password = models.CharField('原始密码', max_length=44, default='')
           

创建用户:

from mysite.models import User

User.objects.create_user(username=username, password=password, real_password=password)
           

单点登陆:

from django.contrib import auth
from django.contrib.auth.hashers import make_password

user = auth.authenticate(username=username, password=password)  # 校验用户密码
if user:  # 如果密码正确
    # 通过存储的原始密码生成新的密码
    user.password = make_password(user.real_password)
    # 更新密码,更新后用户仍然可以使用同样的密码登陆,但是数据库中的加密后的密码已经改变,这样所有终端的登陆状态就会失效
    user.save()
    # 所有终端的登陆状态失效后在当前终端设置cookie和session,使用户进入登陆状态
    auth.login(request, user)