zoukankan      html  css  js  c++  java
  • Django认证系统之cookie与session回顾

    CESSION的产生环境以及作用

    要做项目首先我们要熟悉掌握cookie和session

     

    cookie它不属于http协议范围,http的特点:无状态  无连接,但是我们在这里的需求是要保持

    状态以便于下一次直接访问,那么,这个时候cookie就出现了.

    那么,什么是cookie呢???

     cookie工作原理 服务器产生内容然后浏览器请求保存在本地,当浏览器再次访问时会带上它,服务器就会通过cookie来知道他是谁,

    通俗易懂的举例:就比如有人来你家做客,什么礼物都不带空手来,但是走的时候还要从你家拿上东西,上边的原理就是,浏览器空手去,然后服务器给他给一个可以验证身份的东西。

    cookie缺点:虽然它在一定程度上保存了状态,但是由于cookie本身最大支持4096字节,以及cookie本身保存在客户端,所以容易被拦截,所以它需要有支持更多字节的新东西,并且要保存在服务器,更加安全一点,此时session就产生。

    session产生的环境:cookie的缺点使得session产生了

    session为什么会和cookie搭配这使用呢 ????

    还是应为http的特点,无服务器不知道是谁,所以cookie就是这中间的桥梁

    使用方法:

    可以给每个可客户端的cookie分配一个唯一的id,在访问的时候,通过cookie,服务器便知道是谁,然后再根据id的不同,再去在服务器上保存一段时间的私密资料。比如:“账号和密码”

    总结 :

    cookie弥补了http无状态的不足,让服务知道是谁,但还是cookie以文本的形式保存在本地,自身安全性比较差,所以我们就通过cookie识别不同的用户,对应在session里保存私密的信息以及超过4096字节文本的限制

    登录应用原理

    现在我们已经有能力制作一个登陆页面,在验证了用户名和密码的正确性后跳转到后台的页面。但是测试后也发现,如果绕过登陆页面。直接输入后台的url地址也可以直接访问的。这个显然是不合理的。其实我们缺失的就是cookie和session配合的验证。有了这个验证过程,我们就可以实现和其他网站一样必须登录才能进入后台页面了。

          先说一下这种认证的机制。每当我们使用一款浏览器访问一个登陆页面的时候,一旦我们通过了认证。服务器端就会发送一组随机唯一的字符串(假设是123abc)到浏览器端,这个被存储在浏览端的东西就叫cookie。而服务器端也会自己存储一下用户当前的状态,比如login=true,username=hahaha之类的用户信息。但是这种存储是以字典形式存储的,字典的唯一key就是刚才发给用户的唯一的cookie值。那么如果在服务器端查看session信息的话,理论上就会看到如下样子的字典

    {"abc123":{'login':true,'username':hahah}}

    因为每个cookie都是唯一的,所以我们在电脑上换个浏览器再登陆同一个网站也需要再次验证。那么为什么说我们只是理论上看到这样子的字典呢?因为处于安全性的考虑,其实对于上面那个大字典不光key值123abc是被加密的,value值{'login':true,'username:hahaha'}在服务器端也是一样被加密的。所以我们服务器上就算打开session信息看到的也是类似与以下样子的东西

    {'123abc':dasdasdasd1231231da1231231}

    实现cookie

    1.获取cookie

    request.COOKIES['key']

    2.cookie加盐

    request_get_sined_cookie(key,default=PAISE_ERROR,salt=' ',max_age=None)   

        参数:

             default:默认值

       salt:加密盐

            max_age:后台控制过期时间

    3.删除cookie

    response.delete_cookie("cookie_key",path="/",domain=name)

    4.cookie存到客户端的优缺点:

     优点:

              减轻服务端的压力,提高网站的性能

     缺点:

              安全性不高,很容易被查看或被破解

    实现session

    1.设置session

      request.session['key']="value"

    2.获取session值

      session_name=request.session["key"]

    3.删除session

      del request.session["key"]

    4.检测是否操作session值

      if "key" is request.session

    5.基本操作

    1、设置Sessions值
              request.session['session_name'] ="admin"
    2、获取Sessions值
              session_name = request.session["session_name"]
    3、删除Sessions值
              del request.session["session_name"]
    4、检测是否操作session值
              if "session_name" is request.session :
    5、get(key, default=None)
     
    fav_color = request.session.get('fav_color', 'red')
     
    6、pop(key)
     
    fav_color = request.session.pop('fav_color')
     
    7、keys()
     
    8、items()
     
    9、setdefault()
    10、flush() 删除当前的会话数据并删除会话的Cookie。
                这用于确保前面的会话数据不可以再次被用户的浏览器访问
                例如,django.contrib.auth.logout() 函数中就会调用它。
     
     
    11 用户session的随机字符串
            request.session.session_key
      
            # 将所有Session失效日期小于当前日期的数据删除
            request.session.clear_expired()
      
            # 检查 用户session的随机字符串 在数据库中是否
            request.session.exists("session_key")
      
            # 删除当前用户的所有Session数据
            request.session.delete("session_key")
      
            request.session.set_expiry(value)
                * 如果value是个整数,session会在些秒数后失效。
                * 如果value是个datatime或timedelta,session就会在这个时间后失效。
                * 如果value是0,用户关闭浏览器session就会失效。
                * 如果value是None,session会依赖全局session失效策略。  
    

      

    session存储相关配置

    数据库配置(默认)

    Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
      
    a. 配置 settings.py
      
        SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)
          
        SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
        SESSION_COOKIE_PATH = "/"                               # Session的cookie保存的路径(默认)
        SESSION_COOKIE_DOMAIN = None                             # Session的cookie保存的域名(默认)
        SESSION_COOKIE_SECURE = False                            # 是否Https传输cookie(默认)
        SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支持http传输(默认)
        SESSION_COOKIE_AGE = 1209600                             # Session的cookie失效日期(2周)(默认)
        SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否关闭浏览器使得Session过期(默认)
        SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次请求都保存Session,默认修改之后才保存(默认)
    

      

    缓存配置

    a. 配置 settings.py
      
        SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
        SESSION_CACHE_ALIAS = 'default'                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
      
      
        SESSION_COOKIE_NAME = "sessionid"                        # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
        SESSION_COOKIE_PATH = "/"                                # Session的cookie保存的路径
        SESSION_COOKIE_DOMAIN = None                              # Session的cookie保存的域名
        SESSION_COOKIE_SECURE = False                             # 是否Https传输cookie
        SESSION_COOKIE_HTTPONLY = True                            # 是否Session的cookie只支持http传输
        SESSION_COOKIE_AGE = 1209600                              # Session的cookie失效日期(2周)
        SESSION_EXPIRE_AT_BROWSER_CLOSE = False                   # 是否关闭浏览器使得Session过期
        SESSION_SAVE_EVERY_REQUEST = False                        # 是否每次请求都保存Session,默认修改之后才保存
    

     文件配置

    a. 配置 settings.py
      
        SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
        SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()        
        SESSION_COOKIE_NAME = "sessionid"                          # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
        SESSION_COOKIE_PATH = "/"                                  # Session的cookie保存的路径
        SESSION_COOKIE_DOMAIN = None                                # Session的cookie保存的域名
        SESSION_COOKIE_SECURE = False                               # 是否Https传输cookie
        SESSION_COOKIE_HTTPONLY = True                              # 是否Session的cookie只支持http传输
        SESSION_COOKIE_AGE = 1209600                                # Session的cookie失效日期(2周)
        SESSION_EXPIRE_AT_BROWSER_CLOSE = False                     # 是否关闭浏览器使得Session过期
        SESSION_SAVE_EVERY_REQUEST = False                          # 是否每次请求都保存Session,默认修改之后才保存
    

      

    完整举例 

    urls

    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^login/', views.login),
        url(r'^index/', views.index),
        url(r'^log_out/', views.log_out),
    ]
    

    views 

    from django.shortcuts import render, HttpResponse, redirect
    
    from .models import *
    # Create your views here.
    
    
    def login(request):
        if request.method == "POST":
            user = request.POST.get("user")
            pwd = request.POST.get("pwd")
            user=User.objects.filter(user=user,pwd=pwd).first()
            if user:
                request.session["user"] = user.user
                return redirect("/index/")
                # request.session作用:
                # 1.生成随机字符串
                # 2.写Cookie {"sessionID":"ewfawhuirgw164896532"}
                # 3. django-session 表
                #  sesion-dat       session-key
    
    
    
        return render(request, "login.html")
    
    
    def index(request):
        user=request.session.get("user")
        if not user:
            return redirect("/login/")
        return render(request, "index.html",{"user":user})
    
    def log_out(request):
        request.session.flush()
        return redirect("/login/")
    

    templates  

    index.html
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h1>恭喜你登录成功</h1>
    <h2>hello{{ user }}</h2>
    <a href="/log_out/">注销</a>
    </body>
    </html>
    
    
    
    
    login.html
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <form action="" method="post">
        {% csrf_token %}
        <p>用户名<input type="text" name="user"></p>
        <p>密码<input type="password" name="pwd"></p>
        <input type="submit" value="提交">
    </form>
    </body>
    </html
    

      

  • 相关阅读:
    51nod乘积之和
    Dell服务器安装OpenManage(OMSA)
    Nginx反向代理PHP
    搭建haproxy
    108. Convert Sorted Array to Binary Search Tree
    60. Permutation Sequence
    142. Linked List Cycle II
    129. Sum Root to Leaf Numbers
    118. Pascal's Triangle
    26. Remove Duplicates from Sorted Array
  • 原文地址:https://www.cnblogs.com/1996-11-01-614lb/p/8401287.html
Copyright © 2011-2022 走看看