用户认证组件

组件功能,用session记录登陆验证状态,模块都封装在auth模块里

导包: from django.contrib import auth

这个组件也能让会话跟踪更严谨,

A用户登录后再用同一个客户端登录B用户,session在数据库的记录会被新建且覆盖之前的session,从始至终只有1条数据库记录 而A用户登完,再用A用户账号密码登陆,原始的session在数据库的记录不会发生变化.

前提: 数据库为auth-user表,创建超级用户 python manage.py createsuperuser

API

1.1 authenticate(username=,password=),进行用户名和密码认证

​ 当我们试图登陆一个从数据库中直接取出来不经过authenticate()的User对象会报错的

​ 如果验证成功,返回user对象,失败返回None

Django 用户认证组件_数据库

1.2 login(request,user) 参数2是前一个authenticate认证成功返回的user对象,这个对象会赋值给request.user

也就是request.user =user, 这里request.user如果认证成功则是登陆的用户对象,如果未认证,则是一个匿名用户对象,匿名用户只有username字段可以输出调用

匿名用户还有下面其他几个属性可以用

id 永远为None

username 永远为空字符串

get_username() 永远返回空字符串

is_staff和is_superuser 永远为false

is_active 永远为false

groups 和user_permission 永远为空

is_annoymous() 返回True

is_authenticated 返回False

set_password(),check_password(),save()和delete()会引发NotImplementError

1.3 logout()

auth.logout(request)

该函数接受一个HttpRequest对象,无返回值。当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。

User对象

导包 ​​from django.contrib.auth.models import User​

User对应的就是数据库的auth_user表

2.1 user对象的 is_authenticated

方法1:

def my_view(request):
if not request.user.is_authenticated():
return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))


方法2:

django已经为我们设计好了一个用于此种情况的装饰器:login_requierd()

在setting.py要设置login_url,设置登陆页面,一旦装饰器认证失败返回这个登陆页面

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
...


2.2 创建用户

使用 create_user 辅助函数创建用户:

from django.contrib.auth.models import User
user ``=` `User.objects.create_user(username="",password="",email=""


自己直接调用User.objects.create,也可以只不过这样存储的账号密码是明文,而django自带的创建的是密文

2.3 check_password(passwd)

用户修改密码的时候,让他先输入原来的密码,如果输入正确返回true

2.4修改密码

使用set_password()来修改密码

user =User.objects.get(username="")
user.set_password(password="")
user.save