django-auth组件

auth组件

1、auth模块简介

auth模块是django自带的用户认证模块,包含了身份验证权限管理两部分。python

身份验证用于核实某个用户是否合法,权限管理用于决定一个合法用户有哪些权限数据库

默认状况下,使用django-admin startproject命令后,认证模块已经添加到settings文件中,若是没有请手动添加django

INSTALLED_APPS中添加
`django.contrib.auth`  包含认证框架的核心以及默认模型
`django.contrib.contenttypes`  内容类型系统,用于给模型关联许可
-------------------------------------------------------------------
MIDDLEWARE中添加
`SessionMiddleware`  经过请求管理会话
`AuthenticationMiddleware`  将会话和用户关联

2、用户对象

在django中用户对象是用户认证系统的核心,只有一个用户模型就是User模型,它位于django.contrib.auth.models,使用auth_user表来存储用户数据浏览器

1.建立用户

create_user(username、password)-------普通用户

from django.contrib.auth.models import User
user = User.objects.create_user(username='用户名',password='密码',email='邮箱',...)

user是一个User类的实例,已经保存在了数据库内,你能够随时修改它的属性,例如:
user.last_name='fj'
user.save()

create_superuser(username、password)-----------超级用户

from django.contrib.auth.models import User
user = User.objects.create_superuser(username='用户名',password='密码',email='邮箱',...)

2.修改密码

注:Django默认会对密码进行加密,所以,不要对密码进行直接操做session

set_password(password)------设置密码

user.set_password(password='')
user.save()

check_password(password)-----检查密码是否正确

ok=user.check_password('密码')

须要提供当前请求用户的密码,正确返回True,错误返回False

3.用户验证

authenticate()

验证用户名以及密码是否正确,通常须要username 、password两个关键字参数。app

若是认证成功(用户名和密码正确有效),便会返回一个 User 对象。框架

from django.contrib import auth
user = authenticate(username='usernamer',password='password')
if user:
    #认证成功
else:
    #认证失败

is_authenticated()用来判断是否经过了认证

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

4.User对象的属性

  • is_staff:用户是否拥有网站的管理权限
  • is_active:是否容许用户登陆,设置为False能够在不删除用户的前提下禁止用户登陆

3、在视图中认证用户

django使用session和中间件关联请求对象中和认证系统,每一次请求都包含一个request.user属性,表示当前用户,若是用户未登陆,该值为AnonymousUser实例(匿名用户),若是登陆它就是一个User模型的实例。网站

1.登陆用户

login(HttpRequest,user)---会将用户的ID保存在django的session中

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)
        return HttpResponse('登陆成功')
    else:
        return HttpResponse('用户名或密码错误')

2.注销用户

logout(request)----无返回值

from django.contrib.auth import logout
   
def logout_view(request):
  logout(request)
  • 当前请求的session信息会被所有删除,若是用户没有登陆也不会报错

3.登陆认证装饰器

login_requierd(redirect_field_name='next',login_url='/login/')

用于给视图添加登陆校验ui

from django.contrib.auth.decorators import login_required
      
@login_required
def other_view(request):
  ...
  • redirect_field_name:修改的是浏览器 ? 后面的key值
  • login_url='/login/' 若是没有登陆跳转到的页面 (局部设置)
  • settings.LOGIN_URL设置没有登陆跳转的页面,传递当前路径为url字符串的参数(全局设置)
  • 若是已经登陆,执行正常的视图

4、扩展默认的auth_user表

默认的auth_user表字段是固定的几个,须要扩展的话能够经过下面的方法加密

1.定义一个表模型,和User一对一管理

class UserDetail(models.Model):
    phone=models.CharField(max_length=32)
    # 一对一跟auth_user表作关联
    # 若是是从外部引入的表模型,是不能加引号的
    # 若是加引号,只是在当前model找
    user=models.OneToOneField(to=User)

2.定义一个表模型,继承(AbstractUser类)

from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
    """
    用户信息表
    """
    nid = models.AutoField(primary_key=True)
    phone = models.CharField(max_length=11, null=True, unique=True)
    
    def __str__(self):
        return self.username

建好模型后须要在settings中配置,

AUTH_USER_MODEL='app名.UserInfo'

注:一旦指定了新的表模型,以前的表模型就不能用了。

相关文章
相关标签/搜索