zoukankan      html  css  js  c++  java
  • web框架开发-Django用户认证组件

    可以用认证组件做什么

    针对session的缺陷,

    跟新数据时,不跟新key键,

    用户认证组件是删除后再重建

    用户认证组件很多功能可以直接使用

    利用用户认证表(auth_user,通过Django自己创建的auth_user,且经过加密,每个用户对应不同的KEY)来存储和提取用户信息,

    提供了很多更方便和完善的接口

    内置登陆装饰器

    主要内容预览

    用户认证组件:
    
             功能:用session纪录登陆验证状态
    
             前提:用户表:dajngo自带的auth_user
             
             创建超级用户:python3 manage.py createsuperuser
    
    
             API:
                from django.contrib import auth :
    
                    1 # if 验证成功返回user对象,否则返回None                            
                         user=auth.authenticate(username=user,password=pwd)
    
                     2 auth.login(request,user)   # 之后就可以调用request.user:当前登录对象
                        #request是全局变量,可以直接在模板中引用
                     3 auth.logout(request)    #注销
    
                from django.contrib.auth.models import User # User==auth_user
    
                    4 request.user.is_authenticated()
    
                    5 user = User.objects.create_user(username='',password='',email=''
    总结:


    if not: auth.login(request,user) request.user == AnonymousUser()

    else:
                request.user==登录对象
    request.user是一个全局变量,在任何视图和模板直接使用


    auth模块

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

    1.1 、authenticate()  

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

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

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

    1.2 、login(HttpRequest, user)

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

    此函数使用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)   # request.user:当前登录对象,且是一个全局变量,在任何视图和函数中都能调用
    
        # 跳转至登陆成功后的页面
        ...
      else:
        # 回到登录页面或者提示错误
        ...


    1.3 、logout(request) 注销用户

    from django.contrib.auth import logout
    
    
    # 注销
    def logout_view(request):
    
    logout(request)
    
    # Redirect to a success page.
    该函数接受一个HttpRequest对象,无返回值。当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。

    User对象

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

    2.1 、user对象的 is_authenticated()

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

    要求实现:

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

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

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

    方式一:

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


    方式二:

    django已经为我们设计好了一个用于此种情况的装饰器:login_requierd()

    from django.contrib.auth.decorators import login_required
          
    @login_required
    def my_view(request):
      ...


    若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ ' (这个值可以在settings文件中通过LOGIN_URL进行修改)。并传递  当前访问url的绝对路径 (登陆成功后,会重定向到该路径)。

    2.2 、创建用户

    使用 create_user 辅助函数创建用户:

    from django.contrib.auth.models import User
    user = User.objects.create_user(username='',password='',email=''


    2.3 、check_password(passwd)

    用户需要修改密码的时候 首先要让他输入原来的密码 ,如果给定的字符串通过了密码检查,返回 True


    2.4 、修改密码

    使用 set_password() 来修改密码

    user = User.objects.get(username='')
    user.set_password(password='')
    user.save


    2.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'  # 配合用forms组件做呢?
            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)


    补充:匿名用户对象

    
                   匿名用户对象:
                        匿名用户
                        class models.AnonymousUser
    
                        django.contrib.auth.models.AnonymousUser 类实现了django.contrib.auth.models.User 接口,但具有下面几个不同点:
    
                        id 永远为None。
                        username 永远为空字符串。
                        get_username() 永远返回空字符串。
                        is_staff 和 is_superuser 永远为False。
                        is_active 永远为 False。
                        groups 和 user_permissions 永远为空。
                        is_anonymous() 返回True 而不是False。
                        is_authenticated() 返回False 而不是True。
                        set_password()、check_password()、save() 和delete() 引发 NotImplementedError。
                        New in Django 1.8:
                        新增 AnonymousUser.get_username() 以更好地模拟 django.contrib.auth.models.User。
  • 相关阅读:
    微支付开发(.net)
    微信公众平台开发(一) 配置接口
    [040] 微信公众帐号开发教程第16篇-应用实例之历史上的今天
    [039] 微信公众帐号开发教程第15篇-自定义菜单的view类型(访问网页)
    [038] 微信公众帐号开发教程第14篇-自定义菜单的创建及菜单事件响应
    [037] 微信公众帐号开发教程第13篇-图文消息全攻略
    【微网站开发】之微信内置浏览器API使用
    .Net(c#)汉字和Unicode编码互相转换
    jquery.uploadify上传文件配置详解(asp.net mvc)
    微信公众平台入门开发教程.Net(C#)框架
  • 原文地址:https://www.cnblogs.com/yxiaodao/p/9555197.html
Copyright © 2011-2022 走看看