在Spring Security框架下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。
————————————————
版权声明:本文为CSDN博主「字母哥哥」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hanxiaotongtong/article/details/103347063
在Spring Security框架下JWT的实现细节原理相关推荐
- 基于 Spring Security OAuth2和 JWT 构建保护微服务系统
我们希望自己的微服务能够在用户登录之后才可以访问,而单独给每个微服务单独做用户权限模块就显得很弱了,从复用角度来说是需要重构的,从功能角度来说,也是欠缺的.尤其是前后端完全分离之后,我们的用户信息不一 ...
- 关于Spring Security框架 关于单点登录sso
1.Spring Security的作用 Spring Security主要解决了认证和授权相关的问题. 认证(Authenticate):验证用户身份,即登录. 授权(Authorize):允许用户 ...
- Spring Security 框架详解
SECURITY Spring Security框架 Spring Security框架主要解决了认证与授权的相关问题. 添加依赖 在Spring Boot项目中,需要使用Spring Securit ...
- Spring Security框架
Spring Security框架 关于用户身份认证与授权 Spring Security是用于解决认证与授权的框架. 添加依赖 <!-- Spring Boot Security:处理认证与授 ...
- 使用Spring Security Oauth2 和 JWT保护微服务--Uaa授权服务器的编写
学习自深入理解微服务 采用Spring Security OAuth2 和 JWT的方式,Uaa服务只需要验证一次,返回JWT.返回的JWT包含了用户的所有信息,包括权限信息 从三个方面讲解: JWT ...
- Spring Security OAuth2整合JWT
文章目录 1. Spring Security 与 OAuth2 2. Spring Security OAuth2的配置和使用 ①:引入依赖 ②:配置 spring security ③:配置授权服 ...
- 《深入理解 Spring Cloud 与微服务构建》第十八章 使用 Spring Security OAuth2 和 JWT 保护微服务系统
<深入理解 Spring Cloud 与微服务构建>第十八章 使用 Spring Security OAuth2 和 JWT 保护微服务系统 文章目录 <深入理解 Spring Cl ...
- JWT实战 Spring Security Oauth2整合JWT 整合SSO单点登录
文章目录 一.JWT 1.1 什么是JWT 1.2 JWT组成 头部(header) 载荷(payload) 签名(signature) 如何应用 1.3 JJWT 快速开始 创建token toke ...
- 【Spring Security】Spring Security框架详解
文章目录 前言 一.框架概述 Spring Security的架构 Spring Security的主要特点 二.认证 HTTP Basic认证 表单登录 OpenID Connect 三.授权 基于 ...
- SpringSecurity权限管理框架系列(六)-Spring Security框架自定义配置类详解(二)之authorizeRequests配置详解
1.预置演示环境 这个演示环境继续沿用 SpringSecurit权限管理框架系列(五)-Spring Security框架自定义配置类详解(一)之formLogin配置详解的环境. 2.自定义配置类 ...
最新文章
- 类别继承-程序代码再用
- 容器源码分析之HashTable(八)
- css设置a连接禁用样式_使用CSS禁用链接
- 火速拿来用!对比近 10,000 个 Python 开源项目发现最实用的 TOP34!
- 2021-07-07 https://github.com/pasu/ExamplesforCesium/wiki
- python中exit的作用_python中,exit,return,sys.exit()等的区别与使用方法 | 学步园
- .net网络编程(4)TcpListener、TcpClient
- CS 635: Advanced Systems Programming
- 史上最全使用Nexus搭建Maven服务器详细配置
- Apache Flink 官方文档--流(DataStream API)-旁路输出
- 数据结构(郝斌课程内容概述)
- open3d读取npy点云文件
- 升级OSX High Sierra 10.13遇到一些问题及解决方法
- iOS开发--APP性能检测方案汇总(一)
- 测试自己移动速度的软件,Superspeed一键测速脚本 测试服务器到国内电信/联通/移动速度...
- 说说你平时怎么优化mysql的_面试:给我说说你平时是如何优化MySQL的?
- 疫情下的远程办公,充满了崩溃与机遇
- Impala Shell 和 Impala SQL
- 谷粒商城项目笔记总结(2/2)
- 在线画图工具绘制流程图怎样画