原文 基于Token认证的多点登陆和WebApi保护html
在文章中有错误的地方,或是有建议或意见的地方,请你们多多指正,邮箱: linjie.rd@gmail.comredis
一天张三,李四,王五,赵六去动物园,张三没买票,李四制做了个假票,王五买了票,赵六要直接FQ进动物园数据库
到了门口,验票的时候,张三没有买票被拒绝进入动物园,李四由于买假票而被补,赵六被执勤人员抓获,只有张三进去了动物园编程
后来你们才知道,当一个用户带着本身的信息去买票的时候,验证本身的信息是否正确,那真实的身份证(正确的用户名和密码),验证经过之后经过身份证信息和票据打印时间(用户登陆时间)生成一个新的动物园参观票(Token令牌),给了用户一个,在动物园门口也保存了票据信息(至关与客户端和服务端都保存一份),在进动物园的时候两个票据信息对比,正确的就能够进动物园玩了api
这就是我理解的Token认证.固然可能个人比喻不太正确,望你们多多谅解post
下面是咱们在服务端定义的受权过滤器加密
思路是根据切面编程的思想,至关于二战时期城楼门口设立的卡,当用户想api发起请求的时候,受权过滤器在api执行动做以前执行,获取到用户信息url
若是发现用户没有登陆,咱们会判断用户要访问的页面是否容许匿名访问3d
用户没有登陆可是容许匿名访问,放行客户端的请求htm
用户没有登陆且不容许匿名访问,不容许经过,告诉客户端,状态码403或401,请求被拒绝了
若是发现用户登陆,判断用户的良民证(Token令牌)是真的仍是假的
用户登陆,且良民证是真的,放行
发现良民证造价,抓起来,不容许访问
固然,这里能够加权限,验证是否有某个操做的权限
好了,服务端有验证了,客户端也不能拉下啊,客户端使用了动做过滤器,在用户操做以前或用户操做以后验证登陆信息(这里能够加权限,验证是否有某个操做的权限)
客户端验证思路和服务端验证差很少
下面是客户端验证代码:
可是有良民证也不能也不能无限制的待在城里啊,咱们作了一个时效性,在城市里什么时也不作到达必定的时长后得驱逐出城啊(相似与游戏中的挂机超过必定时间后T出本局游戏)
在这里使用的Redis记录良民证(Token),思路是用户登陆以后生成的新的Token保存在Redis上,设定保存时间20分钟,当有用户有动做以后更新Redis保存有效期
下面是服务端验证token的,token有效,重新写入到Redis
以上就是Token认证
如今说说单点登陆的思路
张三登陆了qq:123456,生成了一个Token以键值对的方式保存在了数据库,键就是qq号,值就是qq信息和登陆时间生成的一个Token
李四也登陆了qq123456,qq信息是一致的,可是qq登陆时间不一样,生成了一个新的Token,在保存的时候发现Redis里已经存在这个qq的键了,说明这是已经有人登陆了,在这里能够判断是否继续登陆,登陆后新的Token信息覆盖了张三登陆QQ生成的Token,张三的Token失效了,当他再次请求的时候发现Token对应不上,被T下线了
多点登陆也是,能够经过qq号加客户端类型做为键,这样手机qq登陆的键是 123456_手机,电脑登陆的键是123456_电脑,这样在保存到Redis的时候就不会发生冲突,能够保持手机和电脑同时在线
可是有一我的用手机登陆qq 123456了,就会覆盖redis中键为123456_手机的Token信息,致使原先登陆那我的的信息失效,被强制下线
来展现代码
判断是否能够登陆
客户端类型实体
这是咱们的客户端类型:
获取token须要的用户信息和登陆时间的实体Model
这是咱们的用户Model
生成Token用的实体
登陆成功,经过JWT非对称加密生成Token
下面是JWT加密和解密的代码
将获取到的Token保存到Redis