JWT用户认证及接口鉴权的细节以及原理

一、回顾JWT的授权及鉴权流程

在笔者的上一篇文章中,已经为大家介绍了JWT以及其结构及使用方法。其授权与鉴权流程浓缩为以下两句话:

  • 授权:使用可信用户信息(用户名密码、短信登录)换取带有签名的JWT令牌
  • 鉴权:解签JWT令牌,校验用户权限。具有某个接口访问权限,开放该接口访问。

二、Spring Security授权细节说明

我相信大家都能理解上面的授权与鉴权的整体流程,但是具体到使用Spring Security 如何实现授权,其中细节及原理还是需要单独提出来说明一下。

2.1.授权流程细节:

  • 当客户端发送“/authentication”请求的时候,实际上是请求JwtAuthenticationController。该Controller的功能是:一是用户登录功能的实现,二是如果登录成功,生成JWT令牌。在使用JWT的情况下,这个类需要我们自己来实现。
  • 具体到用户登录,就需要结合Spring Security实现。通过向Spring Security提供的AuthenticationManager的authenticate()方法传递用户名密码,由spring Security帮我们实现用户登录认证功能。
  • 如果登陆成功,我们就要为该用户生成JWT令牌了。通常此时我们需要使用UserDetailsService的loadUserByUsername方法加载用户信息,然后根据信息生成JWT令牌,JWT令牌生成之后返回给客户端。(spring security的UserDetailsService的功能以及实现,笔者之前的文章已经讲过)
  • 另外,我们需要写一个工具类JwtTokenUtil,该工具类的主要功能就是根据用户信息生成JWT,解签JWT获取用户信息,校验令牌是否过期,刷新令牌等。

2.2.接口鉴权细节:

当客户端获取到JWT之后,他就可以使用JWT请求接口资源服务了。大家可以看到在“授权流程细节”的时序图中,有一个Filter过滤器我们没有讲到,其实它和授权认证的流程关系不大,它是用来进行接口鉴权的。因为授权认证就只有一个接口即可,但是服务资源接口却有很多,所以我们不可能在每一个Controller方法中都进行鉴权,所以在到达Controller之前通过Filter过滤器进行JWT解签和权限校验。

假如我们有一个接口资源“/hello”定义在HelloWorldcontroller中,鉴权流程是如何进行的?请结合上图进行理解:

  • 当客户端请求“/hello”资源的时候,他应该在HTTP请求的Header带上JWT字符串。Header的名称前后端服务自己定义,但是要统一。
  • 服务端需要自定义JwtRequestFilter,拦截HTTP请求,并判断请求Header中是否有JWT令牌。如果没有,就执行后续的过滤器。因为Spring Security是有完成的鉴权体系的,你没赋权该请求就是非法的,后续的过滤器链会将该请求拦截,最终返回无权限访问的结果。
  • 如果在HTTP中解析到JWT令牌,就调用JwtTokenUtil对令牌的有效期及合法性进行判定。如果是伪造的或者过期的,同样返回并执行spring security后续的过滤器链。
  • 如果JWT令牌在有效期内并且校验通过,我们仍然要通过UserDetailsService加载该用户的权限信息,并将这些信息交给Spring Security。只有这样,该请求才能顺利通过Spring Security一系列过滤器的关卡,顺利到达HelloWorldcontroller并访问“/hello”接口。

三、其他的细节问题

  • 一旦发现用户的JWT令牌被劫持,或者被个人泄露该怎么办?JWT令牌有一个缺点就是一旦发放,在有效期内都是可用的,那怎么回收令牌?我们可以通过设置黑名单ip、用户,或者为每一个用户JWT令牌使用一个secret密钥,可以通过修改secret密钥让该用户的JWT令牌失效。
  • 如何刷新令牌?为了提高安全性,我们的令牌有效期通常时间不会太长。那么,我们不希望用户正在使用app的时候令牌过期了,用户必须重新登陆,很影响用户体验。这怎么办?这就需要在客户端根据业务选择合适的时机或者定时的刷新JWT令牌。所谓的刷新令牌就是用有效期内,用旧的合法的JWT换取新的JWT。

本文期望将原理说明白,笔者还会将如何通过Spring Security登录及认证的相关流程,以代码的形式再次发文说明。期待您的关注!

请求令牌 接口_时序图说明JWT用户认证及接口鉴权的细节相关推荐

  1. 【Spring Cloud Alibaba 实战 | 总结篇】Spring Cloud Gateway + Spring Security OAuth2 + JWT 实现微服务统一认证授权和鉴权

    一. 前言 hi,大家好~ 好久没更文了,期间主要致力于项目的功能升级和问题修复中,经过一年时间这里只贴出关键部分代码的打磨,[有来]终于迎来v2.0版本,相较于v1.x版本主要完善了OAuth2认证 ...

  2. 前后端分离之JWT用户认证

    前后端分离之JWT用户认证 在前后端分离开发时为什么需要用户认证呢?原因是由于HTTP协定是不储存状态的(stateless),这意味着当我们透过帐号密码验证一个使用者时,当下一个request请求时 ...

  3. SpringBoot 基于Shiro + Jwt + Redis的用户权限管理 (三) 鉴权

    项目Github地址: https://github.com/baiye21/ShiroDemo SpringBoot 基于Shiro + Jwt + Redis的用户权限管理 (一) 简介与配置 S ...

  4. sip 时序图_时序图怎么看_教你如何看懂时序图 - 什么是时序图_时序图怎么看_教你如何看懂时序图...

    时序图怎么看_教你如何看懂时序图 操作时序永远使用是任何一片IC芯片的最主要的内容.一个芯片的所有使用细节都会在它的官方器件手册上包含.所以使用一个器件事情,要充分做好的第一件事就是要把它的器件手册上 ...

  5. 机械动作时序图怎么画_时序图是怎么画的

    匿名用户 1级 2017-01-14 回答 一.时序图简介(Brief introduction) 时序图(Sequence Diagram)是显示对象之间交互的图,这些对象是按时间顺序排列的.顺序图 ...

  6. 74hc165C语言程序,74hc165使用方法(74hc165功能_内部结构图_时序图)

    描述 74HC165概述 74HC165是一款高速CMOS器件,74HC165遵循JEDEC标准no.7A.74HC165引脚兼容低功耗肖特基TTL(LSTTL)系列. 74HC165是8位并行读取或 ...

  7. sip 时序图_时序图学习(一)

    单片机是一种微控制器,本身内部集成了数种资源比如CPU.内存.内部和外部总线系统,目前大部分还会具有外存.他的主要任务是利用各种资源实现电平控制,可以以此控制与它相连的下级系统,广泛用于工业自动控制领 ...

  8. 机械动作时序图怎么画_时序图怎么画?

    首先说下时序图的创建步骤 1.确定交互过程的上下文: 2.识别参与过程的交互对象: 3.为每个对象设置生命线: 4.从初始消息开始,依次画出随后消息: 5.考虑消息的嵌套,标示消息发生时的时间点,则采 ...

  9. 机械动作时序图怎么画_时序图怎么画步骤教程_时序图用什么工具画_时序图的作用是什么...

    时序图(Sequence Diagram),亦称为序列图.循序图或顺序图,是一种UML交互图.它通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作. 时序图是一个二维图,横轴表示对象,纵轴表 ...

最新文章

  1. 【数据大神必看】微信又添新功能!这个微信群可以学英语,而且全程免费
  2. 面试官系统精讲Java源码及大厂真题 - 46 ServerSocket 源码及面试题
  3. FFMPEG 图像拉伸缩放及数据格式转换
  4. Python 创建目录文件夹
  5. Flutter自定义布局套路
  6. 使用servlet原生API作为参数
  7. 今天突然出现了Property IsLocked is not available for Login '[sa]',我太阳,下面有绝招对付它!...
  8. TSSD2018下载地址及更新说明
  9. tomcat优化问题
  10. 今日头条定位融资商业计划书
  11. 基于zk4500的指纹识别C#实现
  12. “AIIA”杯-国家电网-电力专业领域词汇挖掘
  13. salt returner mysql_saltstack mysql returner
  14. u盘文件夹变成应用程序怎么恢复?方法来了!
  15. PLC抑制干扰电路的设计
  16. 精确控制Origin to Word图片格式、大小及主题使用技巧
  17. Network (哈工大网课笔记)
  18. mc服务器ip是网站,我的世界服务器地址大全
  19. 基于ZigBee的城市道路除尘降温系统设计
  20. 淘宝 Android 端图片体验优化实践

热门文章

  1. 你真的理解Faster RCNN吗?捋一捋Pytorch官方Faster RCNN代码
  2. 为什么程序员总是发现不了自己的Bug?
  3. 【每日一算法】1比特与2比特字符
  4. Pytorch完成基础的模型-线性回归
  5. 复习计算机网络day1-计算机网络的初步了解
  6. python 报错 IndentationError: expected an indented block SyntaxError: invalid character in identifie
  7. Lync 手机客户端登录过程
  8. Device Tree(三):代码分析
  9. 同源注释工具GeneWise安装和使用
  10. 前端/投资者能从阿里巴巴CACSC全球总决赛的项目路演中获得什么