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, login
def 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 logout
def 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_required
def custom_view(request):
...
若用户没有登陆,则会跳转到Django默认的登陆URL"/accounts/login/"(这个值可以在settings文件中通过LOGIN_URL进行修改),并传递当前访问url的绝对路径(登陆成功后,会重定向到该路径)。
三、User对象
- user对象属性:username、password(必填项)password用哈希算法保存到数据库;
- is_staff:用户是否拥有网站的管理权限;
- is_active:是否允许用户登陆,设置为"False",可以不用删除用户来禁止用户登陆;
1.is_authenticated()