Django 用户认证(auth模块)
一、认证登陆
在进行用户登陆验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中;如果用户存在于数据库中,然后再验证用户输入的密码,这样一来就需要自己编写大量的代码。实际上,Django已经提供了内置的用户认证功能。在使用"python manage.py makemigrations"和"python manage.py migrate"迁移完成数据库之后,根据配置文件"settings.py"中的数据库段生成的数据表中已经包含了6张进行认证的数据表,分别是:
其中,进行用户认证的数据表为auth_user,要使用Django自带的认证功能,首先需要导入auth模块。
二、auth模块
from django.contrib import auth
1.authenticate():验证用户输入的用户名和密码是否正确
提供了用户认证,即验证用户名和密码是否正确,一般需要username password两个关键字参数。如果认证信息有效,返回User对象。authenticate()会在User对象上设置一个属性标识哪种认证后端认证了该用户,且该信息在后面的登陆过程中是需要的。当我们试图登陆一个从数据库中直接取出来不经过authenticate()的User对象时会产生错误。user = authenticate(username="someone", password="somepassword")
2.login(HttpRequest, user):用户登陆
该函数接受一个HttpRequest对象,以及一个认证的User对象,此函数使用Django的session框架给某个已认证的用户附加上session id等信息。from django.contrib.auth import authenticate, logindef my_view(request): username = request.POST["username"] password = request.POST["password"] user = authenticate(username=username, password=password) if user: login(request, user) # Redirect to a success page. ... else: # Return an "invalid login" error message. ...
3.logout(request):注销用户
该函数接受一个HttpRequest对象,无返回值,当调用该函数时,当前请求的session信息会全部清除,该用户即使没有登陆,使用该函数也不会报错。from django.contrib.auth import logoutdef my_logout(request): logout(request) # Redirect to a success page.
4.User对象的is_authenticated()
- 1.用户登陆后才能访问某些页面;
- 2.如果用户没有登陆就访问该页面,直接跳转到登陆页面;
- 3.用户在跳转的登陆页面中完成登陆后,自动访问跳转到之前访问的地址页面;
方法1:
def custom_view(request): if not request.user.is_authenticated(): return redirect("%s?next=%s" % (settings.LOGIN_URL, request.path))
方法2:Django已经为我们设计好了一个用于此种情况的装饰器:login_required()
from django.contrib.auth.decorators import login_required@login_requireddef custom_view(request): ...
若用户没有登陆,则会跳转到Django默认的登陆URL"/accounts/login/"(这个值可以在settings文件中通过LOGIN_URL进行修改),并传递当前访问url的绝对路径(登陆成功后,会重定向到该路径)。
三、User对象
- user对象属性:username、password(必填项)password用哈希算法保存到数据库;
- is_staff:用户是否拥有网站的管理权限;
- is_active:是否允许用户登陆,设置为"False",可以不用删除用户来禁止用户登陆;
1.is_authenticated()
如果是真正的User对象,返回值恒为True。用于检查用户是否已经通过了认证。通过认证并不意味着用户拥有任何权限,甚至也不检查该用户是否处于激活状态,这只是表明用户成功通过了认证。这个方法很重要,在后台用request.user.is_authenticated()判断用户是否已经登陆,如果True则,可以向前台展示request.user.name。2.创建用户:create_userfrom django.contrib.auth.models import Useruser = User.objects.create_user(username="", password="", email="")
3.密码检查:check_password(password)
用户需要修改密码的时候,首先输入原来的密码,如果给定的字符串通过了密码检查,返回True;4.修改密码:set_password()user = User.objects.get(username="username") # 获取用户对象user.set_password(password="password") # 设置对象密码user.save()
四、简单示例
1.登陆
def log_in(request): print(request.POST) if request.method == "POST": username = request.POST.get("username") password = request.POST.get("password") print(username, password) user = auth.authenticate(username=username, password=password) # 验证用户名和密码 if user: # 如果认证成功,允许登陆;该login里面包括了session和cookie auth.login(request, user) return redirect("/login/") else: msg = "用户名或密码错误" return render(request, "login.html", {"msg": msg}) return render(request, "login.html")
2.修改密码
def change_pwd(request): if request.method == "POST": old_passwd = request.POST.get("old_passwd") new_passwd = request.POST.get("new_passwd") # 得到当前登陆的用户,判断旧密码是不是和当前的密码一样 username = request.user # 当前登陆的用户名 user = User.objects.get(username=username) # 查看用户 result = user.check_password(old_passwd) # 检查密码是否正确 if result: user.set_password(new_passwd) # 如果密码正确,则设置新密码 user.save() # 保存新密码 return redirect("/login/") else: msg = "密码输入有误" return render(request, "set_passwd.html", {"msg": msg}) return render(request, "set_passwd.html")
3.注册和注销
def register(request): if request.method == "POST": username = request.POST.get("username") password = request.POST.get("password") # 得到用户输入的用户名和密码创建新的用户 User.objects.create_user(username=username, password=password) # User是一个对象 msg = "注册成功,恭喜!" return redirect("/login/") return render(request, "register.html") def log_out(request): auth.logout(request) return redirect("/login/")