• 登陆验证系统实例-三种(cookie,session,auth)


    登陆验证

      因为http协议是无状态协议,但是我们有时候需要这个状态,这个状态就是标识

      前端提交from表单,后端获取对应输入值,与数据库对比,由此对象设置一个标识,该对象

    在别的视图的时候,有此标识,可以访问,没有则让其去登陆

      所以,cookie,session应运而生

    一,cookie验证流程

    1 cookie
    2 客户端(浏览器)第一次请求登陆页面的时候,携带的cookie是空,响应页面也没有给cookie设置    
    3 提交form 表单的时候,携带的cookie是空,服务器去判断,有这个用户,设置了cookie    
    4 跳转到首页携带了cookie
    5 删除cokkie
    6 response.delete_cookie("cookie_key",path="/",domain=name)

    设置cookie

     1 login 函数视图
     2 user=UserInfo.objects.filter(username=user,password=pwd).first()
     3 
     4 if user:
     5     obj=redirect("/index/")
     6     obj.set_cookie("is_login",True,path='/',max_age=10,expires=10)
     7     # cookie 参数
     8     # def set_cookie(self, key, 键
     9     #               value = '', 值
    10     #              max_age = None, 超长时间
    11     #              expires = None, 超长时间
    12     #              path = '/', Cookie生效的路径,
    13     # 浏览器只会把cookie回传给带有该路径的页面,这样可以避免将
    14     # cookie传给站点中的其他的应用。
    15     # / 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
    16     obj.set_cookie("username",user.username)
    17     return obj
    18 
    19 index 函数视图
    20 ret=request.COOKIES.get('is_login')
    21 if ret: 
    22     return render(request,"index.html")
    23 return redirect("/login/")

    二,cookie+session验证流程

    1 cookie + session
    2 与cookie 相同
    3 只是cookie保存的是 session_id:随机字符串  客户端
    4 随机字符串,data 以键值对方式保存在 django_session里面  服务器
    5 跳转首页去跟服务器django_session去拿值
    6 删除 session
    7 可以删除 del request.session['is_login'] 这也只是在django_session里面的data里面删除这个键值对
    8 还可以 这样 request.session.flush() 这样是删除django_sesssion里面的一条记录

    设置session

     1 login 函数视图
     2 user=UserInfo.objects.filter(username=user,password=pwd).first()
     3 
     4 if user:
     5     # 注意这里设置 session
     6      request.session["Is_login"]=True
     7      return redirect("/index/")
     8 
     9 
    10 index 函数视图
    11 ret=request.session.get('is_login')
    12 if ret: 
    13     return render(request,"index.html")
    14 return redirect("/login/")

    三,auth验证流程

    1 auth
    2 与cookie 相同
    3 随机字符串,data 以键值对方式保存在 django_session里面   客户端
    4 跳转首页去跟服务器django_session去拿值    服务器
    5 auth 模块有自己的验证机制,通过  
    6    auth.authenticate(username=user,password=pwd)  匹配验证
    7    auth.login(request,user)                 设置session
    8    request.is_authenticated()           是否通过验证,返回true,false
    9    auth.logout(request)           删除django_session一条记录

    auth验证  ,httprequest.user

     1 HttpRequest.user
     2 
     3   一个 AUTH_USER_MODEL 类型的对象,表示当前登录的用户。
     4 
     5   如果用户当前没有登录,user 将设置为 django.contrib.auth.models.AnonymousUser 的一个实例。你可以通过 is_authenticated() 区分它们。
     6 
     7     例如:
     8 
     9     if request.user.is_authenticated():
    10         # Do something for logged-in users.
    11     else:
    12         # Do something for anonymous users.
    13 
    14     user 只有当Django 启用 AuthenticationMiddleware 中间件时才可用。

    auth验证 实际例子(登陆,注册,更改密码)

    注意,from表单里面不应该有button按钮,会当成数据提交

     1 from django.contrib.auth.models import User
     2 from django.contrib import auth
     3 def login(request):
     4     if request.method == "POST":
     5         user = request.POST.get("user")
     6         pwd = request.POST.get("pwd")
     7         # django 利用自身auth_user表验证,去表里匹配
     8         user=auth.authenticate(username=user,password=pwd)
     9         if user:
    10             # 验证通过,会记录在 djangos_session 表里面一条记录 给某个已认证的用户附加上session id
    11             auth.login(request,user) #  设置session cookie记录 session_id:随机字符串 django_session 随机字符串:session_data
    12             return redirect("/index/")
    13 
    14     return render(request, "login.html")
    15 
    16 def index(request):
    17     user=request.user  #  显示当前登录用户对象
    18 
    19     if not user.is_authenticated(): #  是否通过验证
    20          return redirect("/login/")
    21 
    22     name=request.user.username
    23     return render(request,"index.html",{"name":name})
    24 
    25 def log_out(request):
    26     '''
    27     注销
    28     :param request: 
    29     :return: 
    30     '''
    31     auth.logout(request)  #  request.session.flush()
    32     return redirect("/login/")
    33 
    34 
    35 def reg(request):
    36     if request.method == "POST":
    37         user = request.POST.get("user")
    38         pwd = request.POST.get("pwd")
    39 
    40         user=User.objects.create_user(username=user,password=pwd) #  创建用户信息
    41         return redirect("/login/")
    42 
    43     return render(request,"reg.html")
    44 
    45 def setpwd(request):
    46     '''
    47     更改 密码 ###########
    48     :param request: 
    49     :return: 
    50     '''
    51     if request.method == "POST":
    52         user = request.POST.get("user")
    53         pre_pwd = request.POST.get("pre_pwd")
    54         new_pwd = request.POST.get("new_pwd")
    55         repeat_pwd = request.POST.get("repeat_pwd")
    56         # 没有判断输入新密码2次是否一样
    57         user=auth.authenticate(username=user,password=pre_pwd)
    58         # 更改密码   #############################
    59         if user:
    60             user.set_password(new_pwd)
    61             user.save()
    62             return redirect("/login/")
    63 
    64     return render(request,"setpwd.html")
  • 相关阅读:
    将mysql数据库的数据导出做成excl表格通过邮件发送附件发给指定人
    监听服务端口及邮件报警脚本
    ubantu下docker安装
    python 邮件报警
    3、.net core 部署到IIS
    1、Ubuntu 16.04 安装.net core
    解决asp.net mvc的跨域请求问题
    Jquery常用方法汇总(转)
    mongodb Helper
    数据库CTE递归查询
  • 原文地址:https://www.cnblogs.com/jokerbj/p/8139329.html
Copyright © 2020-2023  润新知