创建用户
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)