• django之用户认证组件


    认证系统 Authentication

    Django自带一个用户认证系统,用于处理用户账户、群组、许可和基于cookie的用户会话。

    Django的认证系统包含了身份验证和权限管理两部分。简单地说,身份验证用于核实某个用户是否合法,权限管理则是决定一个合法用户具有哪些权限。往后,‘认证’这个词同时代指上面两部分的含义。

    Django的认证系统主要包括下面几个部分:

    • 用户
    • 许可
    • 可配置的密码哈希系统
    • 用于用户登录或者限制访问的表单和视图工具
    • 可插拔的后台系统

    类似下面的问题,不是Django认证系统的业务范围,请使用第三方工具:

    • 密码强度检查
    • 登录请求限制
    • 第三方认证

    一、用户对象 --- auth.models

    用户对象是Django认证系统的核心!在Django的认证框架中只有一个用户模型也就是User模型,它位于django.contrib.auth.models

    本节内容叙述的所有功能,都是基于这个User模型的,和这个User模型没有任何关系的自定义用户模型是无法使用Django认证系统的功能的!

    用户模型主要有下面几个字段:

    • username
    • password
    • email
    • first_name
    • last_name

    1.创建用户

    >>> from django.contrib.auth.models import User
    >>> user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')
    # 这时,user是一个User类的实例,已经保存在了数据库内,你可以随时修改它的属性,例如:
    >>> user.last_name = 'Lennon'
    >>> user.save()

    2.创建超级用户

    需要在mange.py 调用指令

    $ python manage.py createsuperuser
    或者
    $ python manage.py createsuperuser --username=joe --email=joe@example.com

    3. 修改密码

    Django默认会对密码进行加密,因此,不要企图对密码进行直接操作。

    要修改密码,有两个办法:

    • 使用命令行: python manage.py changepassword username。如果不提供用户名,则会尝试修改当前系统用户的密码。
    • 使用set_password()方法:
    from django.contrib.auth.models import User
    u = User.objects.get(username='john')
    u.set_password('new password')
    u.save()

    二.auth模块的使用:

    from django.contrib import auth

    django.contrib.auth中提供了许多方法,这里主要介绍其中的三个:

    2.1 、authenticate()  

    提供了用户认证,即验证用户名以及密码是否正确,一般需要username  password两个关键字参数

    如果认证信息有效,会返回一个  User  对象。authenticate()会在User 对象上设置一个属性标识那种认证后端认证了该用户,且该信息在后面的登录过程中是需要的。当我们试图登陆一个从数据库中直接取出来不经过authenticate()的User对象会报错的!!

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

    2.2 、login(HttpRequest, user)

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

    此函数使用django的session框架给某个已认证的用户附加上session id等信息。

    使用示例:

     1 from django.contrib.auth import authenticate, login
     2    
     3 def my_view(request):
     4   username = request.POST['username']
     5   password = request.POST['password']
     6   user = authenticate(username=username, password=password)
     7   if user is not None:
     8     login(request, user)
     9     # Redirect to a success page.
    10     ...
    11   else:
    12     # Return an 'invalid login' error message.
    13     ...
    View Code

    1.3 、logout(request) 注销用户  

    from django.contrib.auth import logout
       
    def logout_view(request):
      logout(request)
      # Redirect to a success page.

    该函数接受一个HttpRequest对象,无返回值。当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。

    三:用户权限

    注意关于权限的认识:

    通过认证并不意味着用户拥有任何权限,甚至也不检查该用户是否处于激活状态,这只是表明用户成功的通过了认证。 这个方法很重要, 在后台用request.user.is_authenticated()判断用户是否已经登录,如果true则可以向前台展示request.user.name

    要求:

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

    2  如果用户没有登录就访问该页面的话直接跳到登录页面

    3  用户在跳转的登陆界面中完成登陆后,自动访问跳转到之前访问的地址

    很多时候,我们要区分已登录用户和未登录用户,只对登录的用户开放一些页面或功能,限制未登录用户的行为。办法有很多,下面是主要几种:

    1.原始的办法

    如果用户未登录,重定向到登录页面,如下所示:

    from django.conf import settings
    from django.shortcuts import redirect
    
    def my_view(request):
        if not request.user.is_authenticated:
            return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
        # ...

    或者显示一个错误信息

    2. 使用装饰器

    原型:login_required(redirect_field_name='next', login_url=None)[source]

    被该装饰器装饰的视图,强制要求用户必须登录后才可以访问。login_required是django自带的权限访问装饰器

    from django.contrib.auth.decorators import login_required
    
    @login_required
    def my_view(request):
        ...
  • 相关阅读:
    Ubuntu14.04升级cmake版本的方法
    在ubuntu16.04-32bits 下编译vlc和vlc-qt开源项目
    从Ubuntu 14.04 LTS版升级到Ubuntu 16.04 LTS
    如何使用Heartbeat,组建一个高可用性的mysql集群
    VLC和Qt结合编写流媒体rtsp播放器
    How to Analyze "Deadlocked Schedulers" Dumps?---WINDBG
    sqlserver-kit.org
    SQLSERVER ----improvedk
    sql server博客
    分享]国外最新安全推文整理
  • 原文地址:https://www.cnblogs.com/Mixtea/p/10494455.html
Copyright © 2020-2023  润新知