Tornado提升之用户验证安全

用户验证

  • 指再受到用户请求后进行预先判断用户的认证状态(是否登录),若验证通过则正常处理,否则进入到登录界面
tornado.web.authenticated装饰器
  • 作用:tornado将确保这个方法的主体只有合法的用户才能调用
get_current_user()
  • 功能:验证用户的逻辑因该写在该方法中,如果该方法返回的为True说明验证成功,否则验证失败

  • 验证失败,请求会将访客重定向到配置中的login_url所指定的路由

  • 整体逻辑:

          用户在没有登录的情况下进入home和cart页面是不被允许的
      所以在home 和 cart 对应的视图函数中添加get_current_user()方法并在config中配置
      重定向路由。这样用户被重定向到登录函数中:http://127.0.0.1:8080/login?next=%2Fcart
          登录函数中先用GET方法render到login页面上,再用POST获取”next“参数。
          登录成功则重定向到POST请求过来的next参数对应的地址,并在此基础上加入一个标识:flag参数
              到达next指定的路由函数中先get_current_user()验证 是否存在flag参数 
              True 则进入 装饰器,进入到home或者cart页面
              FALSE 则进入config.py中的重定向路由中
              
          登录不成功就重定向回login?next=%2F上面next对应的地址
              但是这里有个问题如果html的form中的action不知道回滚过来的next是cart还是home是不行的
              所以在 登录函数中GET方法中先获取网址上的next参数,然后将参数的值与"login?next"合并传给
              login页面,这样form就知道该重定向到哪了
    
    • config.py中添加setting:

      "login_url":"/login"
      
    • login.html

        // action的地址不能写死
        <form action="{{url}}" method="post">
        {% module xsrf_form_html() %}
        。。。。。。
        </form>
      
    • views

        # 用户验证
        class loginHandler(RequestHandler):
            def get(self, *args, **kwargs):
                next = self.get_argument("next","/")
                print("get:",next)
                url = "login?next="+next
                self.render("login.html",url=url)
      
        # 获取form表单
        def post(self, *args, **kwargs):
            name = self.get_body_argument("username")
            pawd = self.get_body_argument("password")
            next = self.get_argument("next", "/")
            if name == "1" and pawd == "1":
                # 获取到网址上面的next参数,获取不到 就是"/"
                print("postYes",next)
                # 登录成功重定向到next 并设置GET参数:flag=logined
                self.redirect(next+"?flag=logined")
            else:
                self.redirect("/login?next="+next)
                print("postno",next)
      
      
            class homeHanler(RequestHandler):
                # 没登陆直接进入home网址:http://127.0.0.1:8080/login?next=%2Fhome
                # %2F 的意思时 "/"
                # 验证用户逻辑方法
                def get_current_user(self,*args,**kwargs):
                    # 检查GET中是否有flag
                    flag = self.get_argument("flag",None)
                    return flag
            
                # 用户验证成功可以进入该装饰器中
                @tornado.web.authenticated
                def get(self, *args, **kwargs):
                    self.render("home.html")
            
            class cartHandler(RequestHandler):
                def get_current_user(self,*args,**kwargs):
                    # 检查GET中是否有flag
                    flag = self.get_argument("flag",None)
                    return flag
            
                # 用户验证成功可以进入该装饰器中
                @tornado.web.authenticated
                def get(self, *args, **kwargs):
                    self.render("cart.html")
      
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值