Django之用户认证组件

在进行用户登陆验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中;如果用户存在于数据库中,然后再验证用户输入的密码,这样一来就要自己编写大量的代码。事实上,Django已经提供了内置的用户认证功能。

auth模块

1
from django.contrib import auth

这里介绍该模块的几个方法:

authenticate

提供了用户认证,即验证用户名以及密码是否正确,一般需要username password两个关键字参数。

如果认证信息有效,会返回一个 User 对象。authenticate()会在User 对象上设置一个属性标识那种认证后端认证了该用户,且该信息在后面的登录过程中是需要的。当我们试图登陆一个从数据库中直接取出来不经过authenticate()User对象会报错的!!

1
2
3
4
5
from django.contrib import auth
def index(request):
user_obj = auth.authenticate(username='user', password='user12345')
if user_obj:
print(user_obj, user_obj.last_name + user_obj.first_name, type(user_obj))

如果账户密码不正确,会返回None

login(HttpRequest, user)

该函数接受一个HttpRequest对象,以及一个认证了的User对象

此函数使用djangosession框架给某个已认证的用户附加上session id等信息。

1
2
3
4
5
6
7
8
from django.contrib import auth
def index(request):
user_obj = auth.authenticate(username='user', password='user12345')
if user_obj:
print(user_obj, user_obj.last_name + user_obj.first_name, type(user_obj))
auth.login(request, user_obj)
# 打印所有session
print(request.session.items())

输出结果:

1
2
user 张三子 <class 'django.contrib.auth.models.User'>
dict_items([('_auth_user_id', '2'), ('_auth_user_backend', 'django.contrib.auth.backends.ModelBackend'), ('_auth_user_hash', 'b6e76123c8ddfd0bbd74224325f45129246db2ac')])

本地cookie保存了sessionid

logout(request)

注销用户,该方法清除本地cookie和服务器session;该函数接受一个HttpRequest对象,无返回值。当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。

1
2
3
4
5
6
7
8
9
10
11
from django.contrib import auth
def index(request):
user_obj = auth.authenticate(username='user', password='user12345')
if user_obj:
print(user_obj, user_obj.last_name + user_obj.first_name, type(user_obj))
# 登录
auth.login(request, user_obj)
# 注销
auth.logout(request)
# 打印session
print(request.session.items())

输出:

1
2
user 张三子 <class 'django.contrib.auth.models.User'>
dict_items([])

User对象

User 对象属性:usernamepassword(必填项)password用哈希算法保存到数据库

is_authenticated()

如果是真正的 User 对象,返回值恒为 True 。 用于检查用户是否已经通过了认证。
通过认证并不意味着用户拥有任何权限,甚至也不检查该用户是否处于激活状态,这只是表明用户成功的通过了认证。 这个方法很重要, 在后台用request.user.is_authenticated()判断用户是否已经登录,如果true则可以向前台展示request.user.name

要求:

1 用户登陆后才能访问某些页面,

2 如果用户没有登录就访问该页面的话直接跳到登录页面

3 用户在跳转的登陆界面中完成登陆后,自动访问跳转到之前访问的地址

方法1:

1
2
3
4
5
6
7
8
9
10
from django.contrib import auth
def index(request):
user_obj = auth.authenticate(username='user', password='user12345')
if user_obj:
print(user_obj, user_obj.last_name + user_obj.first_name, type(user_obj))
# 登录
# auth.login(request, user_obj)
# 注销
auth.logout(request)
print(request.user.is_authenticated)

方法二:

django已经为我们设计好了一个用于此种情况的装饰器:login_requierd(),未登录自动302跳转到登录页面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from django.contrib import auth
from django.contrib.auth.decorators import login_required
def index(request):
user_obj = auth.authenticate(username='user', password='user12345')
if user_obj:
print(user_obj, user_obj.last_name + user_obj.first_name, type(user_obj))
# 登录
auth.login(request, user_obj)
# 注销
# auth.logout(request)
print(request.user.is_authenticated)

# 打印session
print(request.session.items())

创建用户

1
2
3
4
5
6
from django.contrib.auth.models import User

def index(request):
user_obj = User.objects.create_user(username='bbb', password='bbb', email='ss')
print(user_obj, type(user_obj))
return HttpResponse('哦哦哦')

输出:

1
bbb <class 'django.contrib.auth.models.User'>

重复创建会报错:

1
django.db.utils.IntegrityError: (1062, "Duplicate entry 'bbb' for key 'username'")

check_password

用户需要修改密码的时候 首先要让他输入原来的密码 ,如果给定的字符串通过了密码检查,返回 True

1
2
3
4
5
6
7
8
9
10
11
12
from django.contrib import auth
from django.contrib.auth.models import User

def index(request):
user_obj = auth.authenticate(username='user', password='user12345')
if user_obj:
print(user_obj, user_obj.last_name + user_obj.first_name, type(user_obj))
# 登录
auth.login(request, user_obj)

pass_check = User.check_password(user_obj, raw_password='user12345')
print(pass_check, type(pass_check))

输出:

1
2
user 张三子 <class 'django.contrib.auth.models.User'>
True <class 'bool'>

修改密码

使用 set_password() 来修改密码

1
2
3
4
5
6
from django.contrib.auth.models import User

def index(request):
user_obj = User.objects.get(username='user')
user_obj.set_password('999')
user_obj.save()