目录python
Django自带一个用户认证系统,用于处理用户帐户、群组、许可和基于cookie的用户会话。 Django的认证系统主要包含: 1.用户 2.许可 3.组 4.可配置的密码哈希系统 5.用于用户登陆或者限制访问的表单和视图工具 6.可插拔的后台系统
用户对象是Django认证系统的核心,须要导入auth模块,该模块存在于django.contrib下数据库
from django.contrib import auth
Django的认证框架只有一个用户模型,就是User模型,它位于django.contrib.auth.models下.django
用户模型主要有下面几个字段:后端
from django.contrib.auth.models import User user = User.objects.create_user(name='yven',password='123456') user.last_name = 'law' user.save()
提供的用户认证功能就是验证用户名以及密码是否正确,若是认证成功,便返回一个User对象,authenticate()会在该User对象上设置一个属性来标识后端已经认证了该用户,且该信息在后续的登陆过程当中是须要的cookie
user = auth.authenticate(request,username=name,password=pwd) 至关于查询:user=models.User.objects.filter(name=name,pwd=pwd).first()
该函数接收一个HttpRequest对象和一个User对象参数,该方法会把用户的ID保存在Django的session中,一旦登陆成功,函数中的request对象中,就会有一个user对象,就是当前登陆的用户对象,若是没有登陆,request.user=AnonymousUser,匿名用户session
from django.contrib.auth import authenticate, login def login(request): name = request.POST.get('name') pwd = request.POST.get('pwd') user = authenticate(username=name,password=pwd) if user: login(request,user) ... else: ...
from django.contrib.auth import logout def logout(request): logout(request)
def my_view(request): if not request.user.is_authenticated() return redirect('%s?next=%s' % (settings.LOGIN_URL,requst.path)) ...
auth为咱们提供了一个装饰器工具,用来快捷的给某个视图添加登陆校验app
from django.contrib.auth.decorators import login_required @login_required(login_url='/login/') def order(request): ...
login_url:若是没有登陆,跳转到的页面,也能够经过全局设置,在settings中配置LOGIN_URL='/login/'框架
auth提供了建立新用户的方法,也提供了建立超级用户的方法,须要提供必要参数.函数
from django.contrib.auth.models import User user = User.objects.create_user(username='用户名',password='密码'..) superuser = User.objects.create_superuser(username='用户名',password='密码'..)
auth提供一个检查密码是否正确的方法。正确返回true,错误false。工具
bool = request.user.check_password('密码)
auth提供了一个修改密码的方法set_password,接收要设置新密码做为参数,设置完必定要调用用户对象的save()方法
request.user.set_password(password='新密码') user.save()
is_staff:用户是否拥有网站的管理权限。
is_active:是否容许用户登陆,设置为False,能够在不删除用户的前提下禁止用户登陆。
虽然内置的认证系统很好用,可是auth_user表的字段只有固定的几个,实际的应用中须要的字段更多,因此须要对默认的auth_user表进行扩展,第一时间想到的方法是新建另一张表经过一对一和内置的auth_user表关联,这样的确能够知足要求,可是其实能够更好,就是经过继承内置的AbstractUser类,来定义一个本身的Model类。
from django.contrib.auth.models import AbstractUser class UserInfo(AbstractUser): phone = models.CharField(max_length=255) address = models.CharField(max_length=255)
经过这种方法扩展内置的auth_user表以后,必定要在settings.py中告诉Django如今使用新定义的UserInfo表来作用户认证。
AUTH_USER_MODEL = 'app名.UserInfo'
一旦咱们指定了新的认证系统所使用的表,咱们就须要从新在数据库中建立该表,而不能继续使用原来默认的auth_user表了。