Django用户认证体系,基于Django用户认证连串详解

By admin in 4858.com on 2019年4月2日

1. 证实系统概要

  • create_user 创制用户
  • authenticate 验证登录
  • login 记住用户的记名状态
  • logout 退出登录
  • is_authenticated 判断用户是还是不是登录
  • login_required 判断用户是或不是登录的装饰器

一. 认证系统概要

  • create_user 成立用户
  • authenticate 验证登录
  • login 记住用户的记名状态
  • logout 退出登录
  • is_authenticated 判断用户是还是不是登录
  • login_required 判断用户是或不是登录的装饰器

1. 证实系统概要

auth模块简介

二. 创造用户和验证登录

  1. 当用户注册的时候用create_user(username,password,email)默许情形下is_active=True,is_staff=False,is_superuser=False

    • 底层将password用hash算法加密之后存款和储蓄到数据库中。
  2. 当用户登录的时候用authenticate(username=username,password=password)证实登录,判断数据库中是或不是存在用户输入的账号和密码,重回三个user对象。

    • 底层将password用hash算法加密后和数据库中password进行自己检查自纠。

2. 制造用户和认证登录

  1. 当用户注册的时候用create_user(username,password,email)暗中同意情形下is_active=True,is_staff=False,is_superuser=False

    • 底层将password用hash算法加密之后存款和储蓄到数据库中。
  2. 当用户登录的时候用authenticate(username=username,password=password)证明登录,判断数据库中是或不是留存用户输入的账号和密码,重返三个user对象。

    • 底层将password用hash算法加密后和数据库中password实行对照。

create_user 成立用户

auth模块是对登录认证模式的壹种包装,此前大家获得用户输入的用户名及密码后供给自个儿从user表里询问有未有用户名和密码符合的指标,

叁. 记住用户的报到情状

当用户登录的时候用login(request,user)来记住用户的记名情形,暗中同意将用户的id存款和储蓄在session中。

  • login有多个参数四个是request,一个是user,user的源于必须是authenticate返回的。也等于说用login前边必须先调用authenticate

3. 记住用户的记名情形

当用户登录的时候用login(request,user)来记住用户的报到情状,私下认可将用户的id存款和储蓄在session中。

  • login有七个参数一个是request,3个是user,user的源于必须是authenticate返回的。相当于说用login从前务必先调用authenticate

authenticate 验证登录

而有了auth模块然后就足以很自在的去验证用户的报到新闻是还是不是存在于数据库中。

四. 退出登录

当用户注销的时候用logout(request),只供给1个参数request。

肆. 退出登录

当用户注销的时候用logout(request),只须求贰个参数request。

login 记住用户的记名状态

4858.com,除去,auth还对session做了一部分卷入,方便大家校验用户是不是已登录

五. 判断用户是不是登录

  1. 在后台的视图函数里能够用request.user.is_authenticated()判断用户是还是不是登录
  2. 在前端页面中得以用{% if user.is_authenticated %}{% endif %}判断用户是还是不是登录

伍. 判断用户是或不是登录

  1. 在后台的视图函数里能够用request.user.is_authenticated()认清用户是还是不是登录
  2. Django用户认证体系,基于Django用户认证连串详解。在前者页面中能够用{% if user.is_authenticated %}{% endif %}判定用户是或不是登录

logout 退出登录

auth里的办法

6. 装饰器判断用户是不是登录

  1. 依照普通的视图函数能够运用@login_required来点缀,但是依照类视图的get和post方法不可能一直行使@login_required来装饰。
  2. 依照类视图的装饰有以下二种:

    • 首先种:在urls文件中程导弹入login_requtred,直接装饰as_view()函数

    url(r'^$', login_required(UserInfoView.as_view()), name='user') 
    
    • 其次种:自定义3个LoginRequiredView类继承View类,重写as_view()函数,并装饰as_view()函数的重回值。
      大家自定义的视图类就不须要再持续View类,间接接轨LoginRequiredView类就好了。

        class LoginRequiredView(View):
            @classmethod
            def as_view(cls, **initkwargs):
                # 调用View类中as_view方法
                view = super(LoginRequiredView, cls).as_view(**initkwargs)
                # 调用login_required装饰器
                return login_required(view)
      
    • 其三种:自定义3个LoginRequiredMixin类,重写as_view()函数,调用View中的as_view()函数,并装饰as_view()函数的重返值。
      大家自定义的视图类需求先两次三番LoginRequiredMixin类再持续View类。这种方法的关键点在于:多一而再中super()的调用顺序和__mro__的相继是平等的

        class LoginRequiredMixin(object):
            @classmethod
            def as_view(cls, **initkwargs):
                # 调用View类中as_view方法
                view = super(LoginRequiredMixin, cls).as_view(**initkwargs)
      
                # 调用login_required装饰器
                return login_required(view)
      

陆. 装饰器判断用户是还是不是登录

  1. 基于普通的视图函数能够选择@login_required来装点,可是根据类视图的get和post方法不能够直接选用@login_required来装饰。
  2. 依照类视图的装潢有以下三种:

    • 第壹种:在urls文件中导入login_requtred,直接装饰as_view()函数

    url(r'^$', login_required(UserInfoView.as_view()), name='user') 
    
    • 第三种:自定义3个LoginRequiredView类继承View类,重写as_view()函数,并装饰as_view()函数的重返值。
      大家自定义的视图类就不需求再持续View类,直接接轨LoginRequiredView类就好了。

        class LoginRequiredView(View):
            @classmethod
            def as_view(cls, **initkwargs):
                # 调用View类中as_view方法
                view = super(LoginRequiredView, cls).as_view(**initkwargs)
                # 调用login_required装饰器
                return login_required(view)
      
    • 其三种:自定义一个LoginRequiredMixin类,重写as_view()函数,调用View中的as_view()函数,并装饰as_view()函数的重回值。
      大家自定义的视图类须要先三番五次LoginRequiredMixin类再持续View类。那种方式的关键点在于:多三番五次中super()的调用顺序和__mro__的11是壹致的

        class LoginRequiredMixin(object):
            @classmethod
            def as_view(cls, **initkwargs):
                # 调用View类中as_view方法
                view = super(LoginRequiredMixin, cls).as_view(**initkwargs)
      
                # 调用login_required装饰器
                return login_required(view)
      

is_authenticated 判断用户是不是登录

假定想行使auth模块的格局,必须求起初入auth模块

login_required 判断用户是或不是登录的装饰器

from django.contrib import auth

2.
创制用户和表明登录

django.contrib.auth中提供了不少方式,这里根本介绍在这之中的八个:

当用户注册的时候用create_user(username,password,email)暗中认可情形下is_active=True,is_staff=False,is_superuser=False。

1 、authenticate()  

底层将password用hash算法加密之后存款和储蓄到数据库中。

提供了用户认证,即验证用户名以及密码是还是不是科学,1般需求username 
password多少个重大字参数

当用户登录的时候用authenticate(username=username,password=password)验证登录,判断数据库中是否存在用户输入的账号和密码,再次回到2个user对象。

假如注明新闻有效,会回来二个  User  对象。authenticate()会在User
对象上安装三个属性标识这种认证后端认证了该用户,且该音信在后头的记名进度中是急需的。当大家打算登63个从数据库中向来取出来不经过authenticate()的User对象会报错的!!

底层将password用hash算法加密后和数据库中password实行自己检查自纠。

user = authenticate(username='someone',password='somepassword')

三.
记住用户的记名景况

2 、login(HttpRequest, user)

当用户登录的时候用login(request,user)来记住用户的登录景况,私下认可将用户的id存储在session中。

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

login有四个参数3个是request,2个是user,user的来自必须是authenticate再次来到的。也正是说用login在此之前务必先调用authenticate。

此函数使用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 is not None:
    login(request, user)
    # Redirect to a success page.
    ...
  else:
    # Return an 'invalid login' error message.
    ...

当用户注销的时候用logout(request),只必要一个参数request。

3 、logout(request) 注销用户

5. 判断用户是还是不是登录

该函数接受3个HttpRequest对象,无重返值。当调用该函数时,当前恳请的session音信会整整拔除。该用户就是没有登录,使用该函数也不会报错。

在后台的视图函数里能够用request.user.is_authenticated()判断用户是或不是登录

from django.contrib.auth import logout

def logout_view(request):
  logout(request)
 # Redirect to a success page.

在前者页面中得以用{% if user.is_authenticated %}{% endif
%}判断用户是还是不是登录

4 、user对象的 is_authenticated()

6.
装饰器判断用户是不是登录

要求:

依照普通的视图函数能够利用@login_required来装点,可是根据类视图的get和post方法不能够一直动用@login_required来装饰。

一  用户登六后才能访问①些页面,

基于类视图的装潢有以下三种:

二  即使用户并未有登录就访问该页面包车型大巴话一贯跳到登录页面

第一种:在urls文件中程导弹入login_requtred,直接装饰as_view()函数

叁  用户在跳转的登6界面中成就登陆后,自动访问跳转到在此之前访问的地址

url(r'^$', login_required(UserInfoView.as_view()), name='user') 

方法1:

第二种:自定义2个LoginRequiredView类继承View类,重写as_view()函数,并装饰as_view()函数的重返值。
大家自定义的视图类就不须要再持续View类,直接接轨LoginRequiredView类就好了。

直接用auth的is_authenticated()方法求证

class LoginRequiredView(View):
  @classmethod
  def as_view(cls, **initkwargs):
    # 调用View类中as_view方法
    view = super(LoginRequiredView, cls).as_view(**initkwargs)
    # 调用login_required装饰器
    return login_required(view)
def my_view(request):
   if not request.user.is_authenticated():
      return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

第三种:自定义3个LoginRequiredMixin类,重写as_view()函数,调用View中的as_view()函数,并装饰as_view()函数的重返值。
大家自定义的视图类要求先一而再LoginRequiredMixin类再持续View类。那种艺术的关键点在于:多延续中super()的调用顺序和__mro__的次第是壹致的。

方法2:

class LoginRequiredMixin(object):
  @classmethod
  def as_view(cls, **initkwargs):
    # 调用View类中as_view方法
    view = super(LoginRequiredMixin, cls).as_view(**initkwargs)
    # 调用login_required装饰器
    return login_required(view)

传闻request.user.username来表明,假若为空,则评释未有登录

上述那篇基于Django用户认证系统详解就是笔者分享给我们的全部内容了,希望能给大家一个参照,也期待我们多多辅助脚本之家。

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

您大概感兴趣的稿子:

  • 深深明白Django中内置的用户认证
  • 应用Django内置的证实视图完毕用户密码重置功效详解
  • Django自定义用户认证示例详解

方法3:

django已经为大家统一筹划好了三个用于此种境况的装饰器:login_requierd()

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
 ...

若用户未有登录,则会跳转到django暗中同意的 登录U揽胜极光L ‘/accounts/login/ ‘
(那么些值能够在settings文件中经过LOGIN_U奔驰M级L进行修改)。并传递 
当前作客url的相对化路径 ( 登6成功后,会重定向到该路径 )。

user对象

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

is_staff : 用户是不是富有网址的管理权限.

is_active : 是不是允许用户登录,
设置为“False“,能够绝不删除用户来禁止 用户登录

2.1 、is_authenticated()

假诺是的确的 User 对象,重临值恒为 True 。
用于检查用户是或不是早已通过了求证。

由此认证并不意味着用户全体别样权力,甚至也不反省该用户是或不是处于激活状态,那只是申明用户成功的经过了求证。
那么些艺术很关键,
在后台用request.user.is_authenticated()判断用户是不是业已报到,要是true则能够向前台显示request.user.name

2.二 、创立用户

使用 create_user 帮助函数创设用户:

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

2.3 、check_password(passwd)

user = User.objects.get(username=' ')
if user.check_password(passwd):
  ......

用户须求修改密码的时候 首先要让她输入原来的密码
,假如给定的字符串通过了密码检查,重临  True

使用 set_password() 来修改密码

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

二.五 、简单示例

注册:

def sign_up(request):

  state = None
  if request.method == 'POST':

    password = request.POST.get('password', '')
    repeat_password = request.POST.get('repeat_password', '')
    email=request.POST.get('email', '')
    username = request.POST.get('username', '')
    if User.objects.filter(username=username):
        state = 'user_exist'
    else:
        new_user = User.objects.create_user(username=username, password=password,email=email)
        new_user.save()

        return redirect('/book/')
  content = {
    'state': state,
    'user': None,
  }
  return render(request, 'sign_up.html', content)  

修改密码:

@login_required
def set_password(request):
  user = request.user
  state = None
  if request.method == 'POST':
    old_password = request.POST.get('old_password', '')
    new_password = request.POST.get('new_password', '')
    repeat_password = request.POST.get('repeat_password', '')
    if user.check_password(old_password):
      if not new_password:
        state = 'empty'
      elif new_password != repeat_password:
        state = 'repeat_error'
      else:
        user.set_password(new_password)
        user.save()
        return redirect("/log_in/")
    else:
      state = 'password_error'
  content = {
    'user': user,
    'state': state,
  }
  return render(request, 'set_password.html', content)

本人创办User表

亟需注意的是,以上的有所操作,都以本着django自动创建的auth_user表的,我们得以看一下这张表的结构

4858.com 1

那是django给我们自行成立的一张user表,而1旦要用auth模块,就需求求使用(或继续)这张表。

继承表的补益是大家能够增添部分温馨索要的字段,并且还要能够应用auth模块提供的接口、方法

下边就讲一下继承auth的不二等秘书诀:

壹、导入AbstractUser类,并且写一个自定义的类,继承AbstractUser类,如下:

from django.contrib.auth.models import AbstractUser

class UserInfo(AbstractUser):
  """
  用户信息
  """
  nid = models.AutoField(primary_key=True)
  telephone = models.CharField(max_length=11, null=True, unique=True)
  ......

亟待小心的是,UserInfo表里就不须求有auth_user里重复的字段了,比如说username以及password等,不过照旧得以一直动用这几个字段的,并且django会自动将password举行加密

二、那样写完以往,还必要在setting.py文件里铺排:

AUTH_USER_MODEL = 'blog.UserInfo'

那般,django就知道从blog项目下的models去查找UserInfo这张表了

以上正是本文的全部内容,希望对我们的求学抱有协助,也期望大家多多帮衬脚本之家。

你只怕感兴趣的稿子:

  • django接入微博天涯论坛OAuth的点子
  • DJANGO-ALLAUTH社交用户系统的安装配置

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有