JWT对SpringCloud进行系统认证和服务鉴权
JWT对SpringCloud进行系统认证和服务鉴权
一、为什么要使用jwt?
在微服务架构下的服务基本都是无状态的,传统的使用session的方式不再适用,如果使用的话需要做同步session机制,所以产生了了一些技术来对微服务架构进行保护,例如常用的鉴权框架Spring Security OAuth2和用Jwt来进行保护,相对于框架而言,jwt较轻,且可以自包含一些用户信息和设置过期时间,省去了Spring Security OAuth2繁琐的步骤。
二、什么是JWT?
jwt(JSON WEB TOKEN)是一种用来在网络上声明某种身份的令牌(TOKEN),它的特点是紧凑且自包含并且基于JSON,通过一些常用的算法对包含的主体信息进行加密,安全性很高。它通常有三个部分组成:头信息(Header),消息体(Payload),签名(Signature)。
Header通常用来声明令牌的类型和使用的算法,Payload主要用来包含用户的一些信息,Signature部分则是将Base64编码后的Header和Payload进行签名。
三、在Spring Cloud 下如何使用 jwt?
在SC(Spring Cloud简称,以下将都采用这种方式)下通常使用需要安全保护的有两处,分别为系统认证和服务内部鉴权。
1系统认证
(1)基本流程
jwt基本使用方式如下图

用户在提交登录信息后,服务器校验数据后将通过密钥的方式来生成一个字符串token返回给客户端,客户端在之后的请求会把token放在header里,在请求到达服务器后,服务器会检验和解密token,如果token被篡改或者失效将会拒绝请求,如果有效则服务器可以获得用户的相关信息并执行请求内容,最后将结果返回。
在微服务架构下,通常有单独一个服务Auth去管理相关认证,为了安全不会直接让用户访问某个服务,会开放一个入口服务作为网关gateway,只允许外网网关,所有请求首先访问gateway,有gateway将请求路由到各个服务,spring cloud下通常使用zuul来实现网关,整个基本过程如下图所示

客户端请求网关后,网关会根据路径过滤请求,是登录获取token操作的路径则直接放行,请求直接到达auth服务进行登录操作,之后进行JWT私钥加密生成token返回给客户端;是其他请求将会进行token私钥解密校验,如果token被篡改或者失效则直接拒绝访问并返回错误信息,如果验证成功经过路由到达请求服务,请求服务响应并返回数据。
(2)如何实现登录、刷新、注销等?
登录比较简单,在验证身份信息后可以使用工具包例如jjwt根据用户信息生成token并设置有效时长,最后将token返回给客户端存储即可,客户端只需要每次访问时将token加在请求头里即可,然后在zuul增加一个filter,此filter来过滤请求,如果是登录获取token则放行,其他的话用公钥解密验证token是否有效。
如果要实现刷新,则需要在生成token时生成一个refreshKey,在登录时和token一并返回给客户端,然后由客户端保存定时使用refreshKey和token来刷新获取新的有效时长的token,这个refreshKey可自定义生成,为了安全起见,服务器可能需要缓存refreshKey,可使用redis来进行存储,每次刷新token都将生成新的refreshKey和token,服务器需要将老refreshKey替换,客户端保存新的token和refreshKey来进行之后的访问和刷新。
如果要实现注销,并使得旧的token即便在有效期内也不能通过验证,则需要修改登录、刷新、和优化zuul的filter。首先在登录时生成token和refreshKey后,需要将token也进行缓存,如果通过redis进行缓存可以直接放一个Set下,此Set存储所有未过期的token。其次,在刷新时在这个Set中删除旧的token并放入新的。最后对zuulFilter进行优化,在解密时先从redis里存放token的Set查找此token是否存在(redis的Set有提供方法),如果没有则直接拒绝,如果有再进行下一步解密验证有效时长,验证有效时长是为了防止刷新机制失效、没有刷新机制、网络异常强行退出等事件出现,在这种情况下旧的token没有被删除,导致了旧的token一直可以访问(如果只验证是否token是否在缓存中)。在注销时只需要删除redis中Set的token记录就好,最后写个定时器去定时删除redis中Set里面过时的token,原因也是刷新机制失效、没有刷新机制、网络异常强行退出等事件出现导致旧的token没有被删除。
四、JWT存在的问题
jwt第一次生成token 的时候会比较慢,而且因为采用了加密算法保证安全,所以比较耗CPU,在高并发的情况下需要考虑CPU占用问题。还有一个问题,jwt生成的token比较长,可能需要考虑流量问题。
————————————————
原文链接:https://blog.csdn.net/qq_36236890/article/details/79954647
JWT对SpringCloud进行系统认证和服务鉴权的更多相关文章
- 【Spring Cloud & Alibaba 实战 | 总结篇】Spring Cloud Gateway + Spring Security OAuth2 + JWT 实现微服务统一认证授权和鉴权
一. 前言 hi,大家好~ 好久没更文了,期间主要致力于项目的功能升级和问题修复中,经过一年时间的打磨,[有来]终于迎来v2.0版本,相较于v1.x版本主要完善了OAuth2认证授权.鉴权的逻辑,结合 ...
- spring cloud jwt用户鉴权及服务鉴权
用户鉴权 客户端请求服务时,根据提交的token获取用户信息,看是否有用户信息及用户信息是否正确 服务鉴权 微服务中,一般有多个服务,服务与服务之间相互调用时,有的服务接口比较敏感,比如资金服务,不允 ...
- 密码加密与微服务鉴权JWT
博客学习目标 1.用户注册时候,对数据库中用户的密码进行加密存储(使用 SpringSecurity). 2.使用 JWT 鉴权认证. 一.BCrypt 密码加密 1.常见的加密方式 任何应用考虑到安 ...
- Django基于JWT实现微信小程序的登录和鉴权
什么是JWT? JWT,全称Json Web Token,用于作为JSON对象在各方之间安全地传输信息.该信息可以被验证和信任,因为它是数字签名的. 与Session的区别 一.Session是在服务 ...
- [Kong] basic-auth基本认证及ACL鉴权
目录 basic-auth 1. Route上启用插件 2. 创建一个Consumer 3. 为Consumer创建凭证 4. 验证凭证 ACL 用户鉴权 1. 在route上启用ACL鉴权插件 2. ...
- SpringCloud之Zuul过滤器实现登录鉴权实战(十一)
自定义zuul过滤器实现登录鉴权实战 1.新建filter包 2.新建类继承ZuulFilter,重写方法 3.在类顶部加注解@Comment让spring扫描 /** * @author WGR * ...
- 密码加密与微服务鉴权JWT详细使用
[TOC] 1.1.了解微服务状态 微服务集群中的每个服务,对外提供的都是Rest风格的接口,而Rest风格的一个最重要的规范就是:服务的无状态性. 什么是无状态? 1.服务端不保存任何客户端请求者信 ...
- shiro jwt 构建无状态分布式鉴权体系
一:JWT 1.令牌构造 JWT(json web token)是可在网络上传输的用于声明某种主张的令牌(token),以JSON 对象为载体的轻量级开放标准(RFC 7519). 一个JWT令牌的定 ...
- Spring Security 接口认证鉴权入门实践指南
目录 前言 SpringBoot 示例 SpringBoot pom.xml SpringBoot application.yml SpringBoot IndexController SpringB ...
随机推荐
- ERROR: CAN'T FIND PYTHON EXECUTABLE "PYTHON", YOU CAN SET THE PYTHON ENV VARIABLE.解决办法
错误原因:Node.js 在安装模块的时候报错,缺少python环境. 解决办法: 第一种方式: 安装Python及环境变量配置 一定要安装python2.7的版本 环境变量安装可以参考:http:/ ...
- python os.popen('xxx.py') 遇到的坑 (No Child Processes)
1.调用系统库 platform.system() 报错: 2.os.popen() 打开的文件流未关闭也会出现这种错误. f = os.popen() f.read() f.close() 问题复现 ...
- npx vs npm
npx vs npm npx 使用教程
- 修改kvm宿主机主机名后
修改了宿主机的主机名后, libvirtd错误日志如下 virNetSocketReadWire: : End of file while reading data: Input/output err ...
- mac下php配置
打开/关闭服务 sudo apachectl start sudo apachectl stop 查看apche版本 apacectl -v 修改项目默认路径: 打开配置文件目录/private/et ...
- 类型的实参与“LPTHREAD_START_ROUTINE”类型的形参不兼容
在使用利用CreateThread创建线程时 struct A { DWORD WINAPI MyThreadFunction(LPVOID) {} void Run() { HANDLE hThre ...
- 如何修改通过Anaconda安装的jupyter notebook的工作目录
通过Anaconda安装jupyter notebook,对新手来说是一个非常明智的选择,可以避免很多不必要的麻烦! jupyter notbook默认情况下的工作目录是c:\user\...,接下来 ...
- Codeforces Round #596 (Div. 1, based on Technocup 2020 Elimination Round 2)
(第一把div1心态崩了,给大家表演了一把上蓝) (看来以后div1需要先读前三题,如果没把握切掉还是不要交了……) A: 题意是求最少用几个形如$2^{t}+p$的数拼出n,给定n和p.$n\leq ...
- git如何支持doc文档
这个问题很容易解决,只要添加一个 .gitattributes 内容如下: ////////////////////////////////////////////////////////////// ...
- Java11新特性 - 标准Java异步HTTP客户端
Java9开始引入的一个处理 HTTP 请求的的 HTTP Client API,该 API 支持同步和异步,而在 Java 11 中已经为正式可用状态,你可以在 java.net 包中找到这个 AP ...