博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2020/03/09 06-登录功能实现和认证装饰器2
阅读量:3925 次
发布时间:2019-05-23

本文共 2749 字,大约阅读时间需要 9 分钟。

打印一下meta信息 在这里插入图片描述

send
在这里插入图片描述
下面一堆就是meta
在这里插入图片描述
看一下这个meta类型

在这里插入图片描述

在这里插入图片描述
是字典类型,就可以用字典调用里面的东西

在这里插入图片描述

可以这样把key都拿到
在这里插入图片描述
也可以用map,首先有大小写问题,转换成小写

在这里插入图片描述

发送

在这里插入图片描述

是空的,那么改成endswith试试
在这里插入图片描述

在这里插入图片描述

就是这个名字
在这里插入图片描述
通过这个key就可以拿到这个值了

在这里插入图片描述

不想报错可以用get,明确告诉你,找不到就返回none

在这里插入图片描述

这样就那到了对方的认证信息

在这里插入图片描述

打印一下token是否是我们需要的东西
在这里插入图片描述
在这里插入图片描述
拿到了

在这里插入图片描述

如何知道这个token对不对,需要验证下是否篡改过没
这样就是用这个key来解,只要解失败就说明篡改过
在这里插入图片描述
解码失败
在这里插入图片描述
如果错误抛出也不要说自己内部错误,对方可能是恶意的
在这里插入图片描述
现在把token塞进去

在这里插入图片描述

如果成功写一个东西

在这里插入图片描述

现在就ok了
在这里插入图片描述

用key对token进行校验,一定可以校验成功

在这里插入图片描述
看一下payload是不是我们想要的东西

在这里插入图片描述

在这里插入图片描述
userid是添加的,拿到了
在这里插入图片描述
复制之前的token

在这里插入图片描述

这样就验证可以

在这里插入图片描述

在这里插入图片描述

只要发token过来,里面至少有一个userid,我们一开始值放了userid,所以不管解析多少都只有一个userid
在这里插入图片描述
现在payload打印出来的就是这些在这里插入图片描述
假设没有伪装成别人,这就告诉你了,刚才登录过,才给JWT,还不允许修改,只能这台机器,但是现在拿到这个值其实也不敢作数,还要做一件事,拿到这个id到数据库里找找,这个用户被激活了没有,或者被删除了没,被禁用了没。
假如发的jwt这个人已经被禁用了,就不准登录了,所以这时候还需要再查一次数据库。
**
它只是告诉你是谁,但是这个用户有可能在数据库还有其他的一些状态,所以要filter一些条件。get如果拿不到就直接抛出异常,异常捕获就返回用户名和密码错误**
在这里插入图片描述
在很多情况下要做用户身份的验证,比如cookie,这里变一下就可以去拿cookie值,来代表刚才是否登录过。
有些网站保存用户名和密码下次直接登录,它会生成一个token值,是放在cookie里 的,下一回请求的时候,cookie会自动发送,看看一个cookie里有没有对应的值,会解密,如果ok,就代表你是登录过的

在这里插入图片描述

我们现在拿到这个值,也要判断这个人有没有权限,get已经告诉查有此人,实际上还需要filter,看看这个账号是否是删除的
在这里插入图片描述
这个first拿到none说明出问题,用户不能登录
在这里插入图片描述
但是并不是show这地方需要判断
在这里插入图片描述
假如发博客的时候需要登录,这一部分就是公用的,可以到处都用,所以还是提取出去写一个函数
在这里插入图片描述假如这个函数写好了,谁需要谁调用,等于是个装饰器,增加一个用户验证的

在这里插入图片描述

这就是最典型的为一个函数增强什么功能,用户是否已经登录过,进行验证
现在这样做一些微调

在这里插入图片描述

想做的事情是,一旦出现任何问题,就已经return了,show函数就不会return了,就相当于拦截住了
在这里插入图片描述
本来应该通过url映射,找这个函数
在这里插入图片描述
结果在半路,被你的wrapper函数,wrapper函数表示不执行,因为认证未通过,从这里就response,下面show就不执行了。
这个装饰器可以实现 拦截功能,这就是用装饰器自己实现的一种拦截的功能
在这里插入图片描述
其实也有类似的东西,在settings里讲过中间件,用另外的名词讲,也可以叫拦截器,这个拦截器做了两件事情,来的路上拦,第二个回去的路上拦,既拦request,又拦response
在这里插入图片描述
request一直向下走,走过去没有装饰器就到了view函数上去 了,view函数return,再从上面回去,经过response拦截。
中间件,在用户浏览器和你的view函数之间那些东西就叫中间件

在这里插入图片描述

这里增强了也拦了一把,两种方式的区别,装饰器的方式很自由,另外一种中间件的方式是所有请求都要过来

在这里插入图片描述

这种配置所有请求都要经过它无一例外,但是发现有些请求不要经过,这是对所有请求所有response在做拦截,但是其实不需要对所有请求做拦截
在这里插入图片描述
所以需要更灵活的方式,装饰器,查一下这个用户在不在
在这里插入图片描述
用装饰器的好处就是,谁认证就给谁加装饰器,中间件是对所有的request和response都要过一遍

在这里插入图片描述

在这里插入图片描述

查看错误哪里来的,看这三句哪里出错了
在这里插入图片描述

在这里插入图片描述

1后面出了问题

在这里插入图片描述

走一遍

在这里插入图片描述

在这里插入图片描述
拿到数据了
在这里插入图片描述
但是数据不一定能拿到,,所以还需要判断一下,否则还是没有权限,必须符合条件才能进行下一步操作
在这里插入图片描述
拿到user之后,用户登录后点某个页面要做一次验证,如果验证不通过立即告诉对方用户名密码错误

在这里插入图片描述

如果验证通过,会跳转到页面里去,页面里要显示一些相关信息,这些信息怎么来,应该是刚才查询的里面带的信息最多
在这里插入图片描述

虽然解码成功,不代表这个用户查出来允许登录,如果查到就是允许登录,if user就是查到了,如果返回一个对象,就把这个值放到request.user上,动态增加属性,最后request就给了被装饰的函数

在这里插入图片描述

也就是这样,如果成功,在request里动态添加属性,然后这个属性随着request注入给了 show函数
在这里插入图片描述
现在试试打印一下
在这里插入图片描述

在这里插入图片描述

、打印了,这个request被我们装饰器做了些修改

在这里插入图片描述

实现对request和response的拦截,方法有很多,装饰器正好可以做
在这里插入图片描述
完善了登录注册
在这里插入图片描述
密码用一个强密码来解决了,因为盐一直在变,对方拿到了数据库密码,也无法破解数据库里所有的,只能破解其中一个,而且使用一种比较慢的加密算法,我们用穷举的方式也要耗费很长时间

在这里插入图片描述

如何使用jwt
在这里插入图片描述
登录成功就会把用户信息返回回去,最后把token返回去,因为这个token拿了,下一回需要把token信息带上,不带token信息,可能有一些授权的页面的view函数不允许访问了。
怎么在登录后得到jwt,需要让别人提供jwt,首先可以set-cookie方式,也可以从json里去token,总之拿到token后要放在请求头的header部分
在这里插入图片描述
在这里插入图片描述
这个jwt拿到后,会改个名字,上传 名字有http——

在这里插入图片描述

拿到数据解开,得到数据就进行查询,如果能查到说明这个用户当前可以登录(需要现查一遍数据库,允许了才可以登录)
在这里插入图片描述
将请求拿到的信息如果可以,保存到request里,传递给内层函数,show视图函数,视图函数处理后,return之前还可以进行拦截
在这里插入图片描述
视图函数,视图函数处理后,return之前还可以进行拦截

在这里插入图片描述

请求来了之后要进行userid的比较

在这里插入图片描述

在真正使用的时候,jwt也要加个时间,时间戳,并不是永久使用的,生成token的时候把时间给它
在这里插入图片描述
试一下
在这里插入图片描述
login登录失败

在这里插入图片描述

datetime没有json序列化
在这里插入图片描述
用这个试试,代表微秒在这里插入图片描述
再次send就成功了
在这里插入图片描述
也就是这里可以是浮点数

在这里插入图片描述

浮点数不顺眼可以转成int

在这里插入图片描述

下面验证的时候还需要解决时间的问题,过期没过期,需要做一个时间验证
在这里插入图片描述
现在客户端有userid和时间了,因为防篡改可以放心大单用时间,只要解码成功就可以开始做这个事情在这里插入图片描述

转载地址:http://bozgn.baihongyu.com/

你可能感兴趣的文章
java线程面试题集锦(第一版本)
查看>>
记一次java中三元表达式的坑(避免踩坑)
查看>>
面试官:如何实现一个乐观锁(小白都能看得懂的代码)
查看>>
CopyOnWriteArrayList,一个面试中经常问到的冷门容器
查看>>
设计模式之桥接模式
查看>>
设计模式之组合模式
查看>>
java网络编程(1)基础知识点总结
查看>>
java网络编程(2)Socket编程案例(TCP和UDP两种)
查看>>
设计模式之享元模式
查看>>
深入分析java中的多态原理(jvm角度分析)
查看>>
SpringBoot系列(1)基础入门和案例
查看>>
设计模式之命令模式
查看>>
springBoot系列(2)整合MongoDB实现增删改查(完整版)
查看>>
java关键字(6)void
查看>>
面试必问:java中String对象为什么要设计成不可变的呢?
查看>>
深入分析java中的反射机制
查看>>
java集合类(7)Stack
查看>>
7、深入分析java中的泛型机制
查看>>
java序列化机制之protobuf框架(快速高效跨语言)
查看>>
6-1 Book类的设计 (10分)
查看>>