威尼斯人线上娱乐

Django用户认证种类,用户认证

17 4月 , 2019  

一. 评释系统概要

  • create_user 成立用户
  • authenticate 验证登入
  • login 记住用户的记名景况
  • logout 退出登六
  • is_authenticated 决断用户是还是不是登入
  • login_required 剖断用户是还是不是登入的装饰器

一. 表达类别概要

  • create_user 创设用户
  • authenticate 验证登6
  • login 记住用户的登录状态
  • logout 退出登陆
  • is_authenticated 决断用户是还是不是登陆
  • login_required 判别用户是或不是登入的装饰器

1. 验证系列概要

auth模块简介

2. 创设用户和认证登入

  1. 当用户注册的时候用create_user(username,password,email)私下认可情况下is_active=True,is_staff=False,is_superuser=FalseDjango用户认证种类,用户认证。。

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

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

二. 创设用户和验证登入

  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模块是对登入认证方法的1种包装,以前大家赢得用户输入的用户名及密码后须要团结从user表里询问有未有用户名和密码符合的靶子,

三. 记住用户的登6情况

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

  • login有八个参数三个是request,二个是user,user的发源必须是authenticate返回的。也正是说用login从前务必先调用authenticate

三. 记住用户的登陆状态

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

  • login有多少个参数多个是request,贰个是user,user的来源必须是authenticate返回的。也正是说用login后边务必先调用authenticate

authenticate 验证登入

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

4. 退出登入

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

四. 退出登入

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

login 记住用户的登陆状态

除此而外,auth还对session做了一些封装,方便大家校验用户是不是已登陆

伍. 决断用户是或不是登入

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

伍. 判别用户是不是登6

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

logout 退出登6

auth里的法子

陆. 装饰器判定用户是不是登入

  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)
      

6. 装饰器推断用户是不是登陆

  1. 依照普通的视图函数能够动用@login_required来装饰,不过依照类视图的get和post方法不可能平素利用@login_required来装饰。
  2. 传说类视图的装潢有以下三种:

    • 第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__的依次是千篇1律的

        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多少个重点字参数

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

假如证实消息灵通,会回来三个  User  对象。authenticate()会在User
对象上安装2本性能标识那种认证后端认证了该用户,且该新闻在背后的记名进程中是急需的。当大家总结登录一个从数据库中一贯抽出来不通过authenticate()的User对象会报错的!!

底层将password用hash算法加密后和数据库中password举办相比。

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

三.
记住用户的登陆情状

2 、login(HttpRequest, user)

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

该函数接受3个HttpRequest对象,以及2个证实了的User对象

login有八个参数二个是request,一个是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. 判定用户是不是登陆

该函数接受2个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()

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

要求:

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

一  用户登录后手艺访问1些页面,

据书上说类视图的装修有以下二种:

二  假如用户未有登六就访问该页面包车型大巴话一向跳到登入页面

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

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

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))

第三种:自定义1个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暗中认可的 登入UPRADOL ‘/accounts/login/ ‘
(这么些值能够在settings文件中通过LOGIN_U瑞鹰L进行修改)。并传递 
当前走访url的断然路线 ( 登入成功后,会重定向到该路线 )。

user对象

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

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

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

2.1 、is_authenticated()

只倘诺确实的 User 对象,重临值恒为 True 。
用于检查用户是不是早已通过了表达。

因此认证并不意味着用户具备别样权力,甚至也不反省该用户是不是处在激活状态,那只是注明用户成功的通过了表达。
那一个艺术很关键,
在后台用request.user.is_authenticated()判别用户是或不是早已报到,假若true则能够向前台呈现request.user.name

二.二 、创建用户

使用 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表,而只要要用auth模块,就须求求使用(或一连)那张表。

继承表的裨益是大家得以追加部分投机必要的字段,并且同时能够应用auth模块提供的接口、方法

下边就讲一下承接auth的办法:

一、导入AbstractUser类,并且写3个自定义的类,承袭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地图