用户认证,Django用户认证连串

壹. 验证种类概要

  • create_user 创造用户
  • authenticate 验证登入
  • login 记住用户的记名状态
  • logout 退出登6
  • is_authenticated 决断用户是不是登6
  • login_required 决断用户是或不是登入的装饰器

1. 申明系统概要

  • create_user 制造用户
  • authenticate 验证登入
  • login 记住用户的记名状态
  • logout 退出登六
  • is_authenticated 剖断用户是不是登6
  • 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. 当用户登6的时候用authenticate(username=username,password=password)用户认证,Django用户认证连串。注解登入,判别数据库中是或不是存在用户输入的账号和密码,再次回到三个user对象。

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

create_user 创立用户

auth模块是对登陆认证方式的1种包装,在此以前我们得到用户输入的用户名及密码后须求协调从user表里询问有未有用户名和密码符合的目的,

3. 记住用户的报到情形

当用户登入的时候用login(request,user)来记住用户的记名状态,默许将用户的id存款和储蓄在session中。

  • login有几个参数三个是request,1个是user,user的发源必须是authenticate返回的。也正是说用login事先必须先调用authenticate

叁. 记住用户的登六景况

当用户登入的时候用login(request,user)来记住用户的报到意况,暗中认可将用户的id存款和储蓄在session中。

  • login有五个参数二个是request,2个是user,user的发源必须是authenticate返回的。也正是说用login事先必须先调用authenticate

authenticate 验证登六

而有了auth模块然后就可以很轻巧的去验证用户的记名新闻是或不是留存于数据库中。

4. 退出登入

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

4. 退出登入

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

login 记住用户的登六情状

除了这一个之外,auth还对session做了部分装进,方便我们校验用户是不是已报到

伍. 剖断用户是还是不是登入

  1. 在后台的视图函数里能够用request.user.is_authenticated()认清用户是或不是登陆
  2. 在前端页面中能够用{% if user.is_authenticated %}{% endif %}剖断用户是还是不是登6

伍. 判定用户是不是登6

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

logout 退出登入

auth里的主意

亚洲必赢官网 ,陆. 装饰器判别用户是不是登入

  1. 基于普通的视图函数能够利用@login_required来装点,然则依照类视图的get和post方法不能一直动用@login_required来装饰。
  2. 听大人讲类视图的装修有以下二种:

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

    url(r'^$', login_required(UserInfoView.as_view()), name='user') 
    
    • 其次种:自定义1个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)
      

6. 装饰器决断用户是不是登入

  1. 根据普通的视图函数能够行使@login_required来装饰,不过根据类视图的get和post方法不能够直接动用@login_required来装饰。
  2. 基于类视图的装点有以下三种:

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

    url(r'^$', login_required(UserInfoView.as_view()), name='user') 
    
    • 第二种:自定义一个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__的逐一是一模一样的

        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

二.
创立用户和验证登6

django.contrib.auth中提供了成都百货上千办法,那里首要介绍其中的七个:

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

1 、authenticate()  

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

提供了用户认证,即验证用户名以及密码是还是不是科学,1般必要username 
password多少个第2字参数

当用户登入的时候用authenticate(username=username,password=password)验证登6,推断数据库中是或不是留存用户输入的账号和密码,再次来到二个user对象。

要是注解消息灵通,会回到多少个  User  对象。authenticate()会在User
对象上安装3本性质量标准记那种认证后端认证了该用户,且该消息在前面的记名进程中是索要的。当大家准备登录2个从数据库中一贯收取来不经过authenticate()的User对象会报错的!!

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

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

3.
记住用户的报到境况

2 、login(HttpRequest, user)

当用户登入的时候用login(request,user)来记住用户的记名景况,暗中认可将用户的id存款和储蓄在session中。

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

login有多少个参数一个是request,三个是user,user的发源必须是authenticate重临的。也正是说用login在此以前务必先调用authenticate。

此函数使用django的session框架给有个别已证实的用户附加上session id等音讯。

4. 退出登六

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。

三 、logout(request) 注销用户

伍. 剖断用户是还是不是登入

该函数接受一个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来装饰。

1  用户登录后技巧访问1些页面,

依照类视图的装饰有以下两种:

二  假如用户并未有登入就访问该页面包车型客车话一向跳到登陆页面

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

三  用户在跳转的登入分界面中做到登入后,自动访问跳转到在此以前访问的地方

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

方法1:

第二种:自定义三个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))

第三种:自定义贰个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_UKoleosL进行改换)。并传递 
当前造访url的相对化路线 ( 登录成功后,会重定向到该路线 )。

user对象

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

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

is_active : 是或不是同意用户登入,
设置为“False“,能够毫无删除用户来禁止 用户登6

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 

二.5 、轻便示例

注册:

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表的,大家得以看一下那张表的布局

亚洲必赢官网 1

那是django给大家机关创制的一张user表,而1旦要用auth模块,就必须求使用(或持续)那张表。

承继表的利润是我们得以扩大部分和谐须求的字段,并且还要能够应用auth模块提供的接口、方法

上边就讲一下承继auth的法子:

一、导入AbstractUser类,并且写1个自定义的类,承接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举办加密

2、那样写完以后,还需求在setting.py文件里布署:

AUTH_USER_MODEL = 'blog.UserInfo'

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

以上正是本文的全部内容,希望对我们的就学抱有扶助,也愿意我们多多协助脚本之家。

您恐怕感兴趣的稿子:

  • django接入和讯腾讯网OAuth的章程
  • DJANGO-ALLAUTH社交用户系统的安装配备
网站地图xml地图