基于Django用户认证系统详解,Django用户认证系统

1. 注脚种类概要

  • create_user 成立用户
  • authenticate 验证登录
  • login 记住用户的登录意况
  • logout 退出登录
  • is_authenticated 判断用户是不是登录
  • login_required 判断用户是不是登录的装饰器

1. 验证系统概要

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

壹. 认证系统概要

auth模块简介

贰. 成立用户和验证登录

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

    • 澳门葡京备用网址,底层将password用hash算法加密之后存款和储蓄到数据库中。
  2. 当用户登录的时候用authenticate(username=username,password=password)注脚登录,判断数据库中是否存在用户输入的账号和密码,重回3个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模块是对登录认证方法的一种包装,从前大家赢得用户输入的用户名及密码后需求团结从user表里询问有未有用户名和密码符合的靶子,

三. 记住用户的登录情形

当用户登录的时候用login(request,user)来记住用户的报到景况,默许将用户的id存款和储蓄在session中。

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

三. 记住用户的报到意况

基于Django用户认证系统详解,Django用户认证系统。当用户登录的时候用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 %}判定用户是不是登录

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

  1. 在后台的视图函数里能够用request.user.is_authenticated()看清用户是还是不是登录
  2. 在前者页面中得以用{% 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') 
    
    • 其次种:自定义贰个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. 基于类视图的点缀有以下三种:

    • 率先种:在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

二.
成立用户和验证登录

django.contrib.auth中提供了无数艺术,那里首要介绍个中的八个:

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

1 、authenticate()  

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

提供了用户认证,即验证用户名以及密码是不是科学,一般须要username 
password多少个首要字参数

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

万一证实新闻灵通,会回到三个  User  对象。authenticate()会在User
对象上安装3个性质标识那种认证后端认证了该用户,且该消息在末端的报到进度中是内需的。当大家试图登陆3个从数据库中平素取出来不通过authenticate()的User对象会报错的!!

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

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

三.
记住用户的报到状态

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。

3 、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()

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

要求:

依照普通的视图函数可以使用@login_required来装饰,不过依照类视图的get和post方法不能够直接行使@login_required来装饰。

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

根据类视图的点缀有以下三种:

贰  若是用户未有登录就走访该页面包车型地铁话一向跳到登录页面

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

3  用户在跳转的登陆界面中成功登陆后,自动访问跳转到从前访问的地点

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__的次第是1致的。

方法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已经为大家陈设好了2个用来此种情状的装饰器:login_requierd()

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
 ...

若用户并未有登录,则会跳转到django暗中认可的 登录UTucsonL ‘/accounts/login/ ‘
(那几个值能够在settings文件中经过LOGIN_USportageL进行修改)。并传递 
当前访问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 

二.伍 、简单示例

注册:

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模块,就必供给使用(或一连)那张表。

继承表的补益是我们得以追加1些谈得来必要的字段,并且同时可以运用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实行加密

贰、那样写完事后,还要求在setting.py文件里布署:

AUTH_USER_MODEL = 'blog.UserInfo'

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

以上正是本文的全体内容,希望对大家的学习抱有扶助,也期望我们多多支持脚本之家。

您可能感兴趣的稿子:

  • django接入搜狐乐乎OAuth的格局
  • DJANGO-ALLAUTH社交用户系统的安装配备

相关文章

发表评论

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

*
*
Website