用户认证组件
用户认证
auth模块
用户姓名,密码等信息存储在auth_user表中,其中表中存放的密码为用哈希算法得到的密文
模块导入
from django.contrib import auth
request.user
如果在此之前浏览器成功登录该页面,则request.user代表登录对象
如果在此之前浏览器未登录或登录页面不成功,则request.user代表默认匿名对象AnonymousUser。该对象里id,username属性值为None
方法:
1. authenticate()
提供了用户认证,即验证用户名以及密码是否正确,一般需要username,password两个关键字参数
如果认证信息有效,则返回一个User对象。否则返回None
当我们试图登录一个从数据库中直接取出来不经过authenticate()的User对象,则会报错
user_obj = auth.authenticate(username='someone', password='somepassword')
2. login(request, user)
该函数接受一个HttpRequest对象,以及一个认证了的User对象
调用该函数,执行了两个功能:
1) 注入session信息:request.session["user_id"] = user_obj.pk
2) request.user = user_obj
from django.contrib.auth import authenticate, login def my_view(request): username = request.POST.get("username") password = request.POST.get("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 ...
3. logout(request)
注销用户
该函数接受一个HttpRequest对象,无返回值。
当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错
def logout_view(request): auth.logout(request) # Redirect to a success page
User对象
User对象属性:username, password(必填项)password用哈希算法保存到数据库
User对象的is_authenticated()
如果是真正的User对象,返回值为True
用于检查用户是否已经通过了认证
通过认证并不意味着用户拥有任何权限,甚至也不检查该用户是否处于激活状态,这只是表明用户成功的通过了认证
后台可以用request.user.is_authenticated()判断用户是否已经登录,如果为True则可以向前台展示request.user.name
@login_required() 装饰器
若用户没有登录就访问需要登录后才能访问的页面,则会先跳转到django默认的登录URL"/accounts/login/"(这个值可以在settings文件中通过LOGIN_URL进行修改),并传递当前访问的url的绝对路径,在登录成功后,会重定向到该路径。
@login_required()导入
from django.contrib.auth.decorators import login_required
""" 要求: 1. 用户在没有登录情况下访问index,order页面,先跳到登录页面 2. 用户在登录界面完成登录后,自动跳回之前访问的页面 """ from django.shortcuts import render, HttpResponse, redirect # Create your views here. from django.contrib import auth from django.contrib.auth.decorators import login_required def login(request): if request.method == "GET": return render(request, "login.html") else: user = request.POST.get("user") pwd = request.POST.get("pwd") user_obj = auth.authenticate(username=user, password=pwd) if user_obj: auth.login(request, user_obj) path = request.GET.get("next") or "/index/" # 获取访问页面路径 return redirect(path) else: return redirect("/login/") @ login_required def index(request): return render(request, "index.html") @ login_required def order(request): return render(request, "order.html") def logout(request): auth.logout(request) return redirect("/login/")
创建用户
User导入
from django.contrib.auth.models import User
创建超级用户
User.objects.create_superuser(username="someone", password="somepassword")
创建普通用户
User.objects.create(username="someone", password="somepassword") # 密码为明文 User.objects.create_user(username="someone", password="somepassword") # 密码为密文
修改密码
user = User.objects.get(username="someone") user.set_password(password="password") user.save
check_password(password)
检查密码
用户需要修改密码的时候,首先要让他输入原来的密码,如果给定的字符串通过了密码检查,返回True