在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.自定义配置类 ...
最新文章
- 太尴尬!百度某程序员向领导请假去面试,却在面试一楼大厅和领导相遇,网友:缘分啊!回去一起对对面试题!...
- 基于激光雷达点云的3D检测方法汇总(LiDAR only)
- 植物MWAS研究—谷子产量与微生物组关联分析
- 苹果工具条_苹果发布iOS 13.4首个测试版:能让iPhone变身为车钥匙
- 大数据销售管理服务提供商InsideSales获得1亿美元融资
- 在实际使用中 mysql所支持的触发器有_计算机二级考试MySQL数据库每日一练 12月26日...
- 原生html小游戏,原生JS实现别踩白块小游戏(一)
- 判断C#中的字符串是否是数字,如果是转换成int类型
- 第三次学JAVA再学不好就吃翔(part6)--基础语法之char数据类型
- Java 并发编程Semaphore的应用与源码解析
- 高阶台式计算机零组件,2010年电脑旺季!零组件缺DDR3封测紧
- Node中POST请求的正确处理方式
- 幼儿抽象逻辑思维举例_幼教科目二 | 幼儿认知的发展(思维)
- Ansys 2022 安装教程(附赠免费的安装包)
- 深度 | 国产数据库到底行不行?金仓数据库审计性能实测
- Navicat连接SqlServer 提示远程主机关闭一个现有连接
- css实现内凹圆角,利用圆角反向进行(转)
- css3中var函数
- 差分进化算法python 指派问题_多目标优化算法
- eclipse连接不上mysql数据库,而且是在javaWeb开发环境中
热门文章
- Fastdfs(1)安装之Tracker
- python一个简单的一元二次方程求解的过程
- tomcat 7配置ssl教程
- Dissecting the GZIP format
- AMD OpenCL大学课程(13) OpenCL扩展
- 跨域访问JQuery+.NET实现的一种思路,以及极简单Demo
- NOD32 AntiVirus v2.70.16杀毒软件
- 关于ext4 simg fill chunk type
- 应用程序热补丁(二):自动生成热补丁
- C++入门系列博客二 C++ 控制流