用户认证,Django用户认证系统

1. 验证种类概要

  • create_user 创制用户
  • authenticate 验证登入
  • login 记住用户的报到情形
  • 用户认证,Django用户认证系统。logout 退出登入
  • is_authenticated 剖断用户是还是不是登入
  • login_required 决断用户是或不是登录的装饰器

一. 表明类别概要

  • create_user 成立用户
  • authenticate 验证登陆
  • login 记住用户的报到状态
  • logout 退出登6
  • 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)证实登入,剖断数据库中是还是不是存在用户输入的账号和密码,再次回到1个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)证明登入,判定数据库中是或不是存在用户输入的账号和密码,重返一个user对象。

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

create_user 创立用户

auth模块是对登入认证格局的一种包装,此前大家拿到用户输入的用户名及密码后须求协调从user表里询问有未有用户名和密码符合的指标,

三. 记住用户的报到情状

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

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

3. 记住用户的登六情形

当用户登6的时候用login(request,user)来记住用户的报随地境,暗中同意将用户的id存款和储蓄在session中。

  • 美高梅开户网址 ,login有三个参数二个是request,三个是user,user的根源必须是authenticate返回的。也便是说用login在此以前务必先调用authenticate

authenticate 验证登6

而有了auth模块然后就能够很轻巧的去验证用户的报到新闻是或不是留存于数据库中。

4. 退出登入

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

4. 退出登六

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

login 记住用户的登陆情形

除此之外,auth还对session做了部分装进,方便大家校验用户是或不是已登陆

五. 判定用户是不是登六

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

伍. 判定用户是或不是登入

  1. 在后台的视图函数里能够用request.user.is_authenticated()看清用户是或不是登6
  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') 
    
    • 第二种:自定义一个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)
      
    • 其三种:自定义1个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)
      

⑥. 装饰器决断用户是不是登陆

  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__的相继是平等的

        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)验证登录,判定数据库中是或不是存在用户输入的账号和密码,再次来到3个user对象。

假定表明新闻有效,会回去2个  User  对象。authenticate()会在User
对象上设置一本性质量标准记那种认证后端认证了该用户,且该消息在后面包车型大巴报到进度中是索要的。当我们准备登录贰个从数据库中央直机关接收取来不经过authenticate()的User对象会报错的!!

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

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

3.
记住用户的报到情状

2 、login(HttpRequest, user)

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

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

login有三个参数1个是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。

叁 、logout(request) 注销用户

5. 推断用户是还是不是登入

该函数接受二个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  用户登录后技艺访问一些页面,

传闻类视图的装裱有以下两种:

二  要是用户未有登六就访问该页面包车型的士话一直跳到登6页面

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

3  用户在跳转的登入分界面中产生登录后,自动访问跳转到在此以前访问的地点

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

方法1:

第二种:自定义3个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用户认证系列详解正是我分享给大家的全体内容了,希望能给我们2个参考,也希望大家多多扶助脚本之家。

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

你恐怕感兴趣的小说:

  • 长远掌握Django中内置的用户认证
  • 动用Django内置的认证视图完结用户密码复位成效详解
  • Django自定义用户认证示例详解

方法3:

django已经为大家设计好了3个用来此种境况的装饰器:login_requierd()

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
 ...

若用户并未有登陆,则会跳转到django暗中同意的 登陆UKugaL ‘/accounts/login/ ‘
(那个值能够在settings文件中通过LOGIN_UXC60L进行改变)。并传递 
当前访问url的断然路线 ( 登入成功后,会重定向到该路线 )。

user对象

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

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

is_active : 是或不是同意用户登6,
设置为“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的办法:

1、导入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地图