SpringOAuth2之JWT

标签: Springboot 分类: Java 创建时间:2020-07-30 10:59:06 更新时间:2024-11-23 10:24:24

关于权限认证和spring gateway我都单独尝试过如何使用,现在的需求是使用微服务架构,和网关技术,如何实现各个微服务之间的相互认证。客户端请求先通过网关,然后网关判断是否认证过,没有认证过就要进行认证,认证过之后,要在转发之前添加一个token,为了以后的其他微服务通过token进行认证,调用微服务的来源是否是来自网关的。虽然不知道这样的思路是不是对的,但是以我有限的java经验,目前能想到的就是这种方法了。

根据相应的参考文章,我觉得下面这张图能很好的反应基于spring gateway和token进行微服务认证的流程

有些文章中是这样说的:
服务网关的一大作用就是可以对外部的请求进行集中权限认证,这样每个具体的服务就不用操心权限管理的问题了,可以专心于业务的实现。基本的思路是外部客户端首先需要获取一个由系统中独立的认证中心负责签发的accessToken,然后每次请求服务时在http header中携带该Token,服务网关负责校验accessToken的有效性以及是否具备访问该服务的权限,具体的思路和我之前介绍单系统权限管理的思路比较类似,可以查看 Spring Boot整合Shiro和JWT的无状态权限管理方案 这篇文章。

参考文章:
1.sping cloud gateway集成spring security实现前后端分离模式下的后端微服务认证授权
2.王广帅 / Spring Gateway Security (这是别人的一个代码库,没有仔细的去研究)
3.Spring Cloud Gateway 实现Token校验 (这篇文章其实可以提供一个整体的思路,就是认证授权和网关服务以及微服务都是分开的,认证授权服务负责对用户进行权限校验,并添加token,然后网关负责验证token并添加相应的信息给下游服务,下游服务根据添加的token验证是否有调用的权限)
4.spring cloud gateway和spring security 集成的完整入门例子 (这篇文章其实讲的都是security的操作,根本没有gateway的什么事,虽然引入了gateway依赖,但是在认证过程中没有提到任何的gateway信息)
5.Spring Cloud Gateway 使用 Token 验证 (代码非常的简单,当然也就缺少很多的解释了)
6.微服务权限终极解决方案,Spring Cloud Gateway + Oauth2 实现统一认证和鉴权! (这篇文章已经非常符合我的要求了,包括了JWT认证,包括了gateway添加security,包括了其他的一些知识点,还给了一个micro-oauth2-auth的例子,实现了基于密码模式的oauth2认证)

JWT相关内容

JWT有下面的几个特点:

  • (1)JWT 默认是不加密,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次。
  • (2)JWT 不加密的情况下,不能将秘密数据写入 JWT。
  • (3)JWT 不仅可以用于认证,也可以用于交换信息。有效使用 JWT,可以降低服务器查询数据库的次数。
  • (4)JWT 的最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。
  • (5)JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。
  • (6)为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输。
参考文章:
1.Web安全通讯之JWT的Java实现 (包括了原生的java实现,以及jjwt应用和jjwt源码)
2.JWT(二):使用 Java 实现 JWT (这篇文章其实有很多东西,包括入门和jjwt工具,还有各种签名算法的解释)
3.JSON Web Token 入门教程 (JWT的说明,阮老师出品使用JWT之前,还是先看看这篇文章。)
4.听说你的JWT库用起来特别扭,推荐一款贼好用的! (这个是一个推荐文章,作者刚开始也是使用了jjwt工具,后来换成了JWT这个库,这个库很强大,这篇文章也是很全面的,包括了JWT加密与解密的部分以及配置Payload等内容)
5.【小家思想】通俗易懂版讲解JWT和OAuth2,以及他俩的区别和联系(Token鉴权解决方案) (这个是讲了JWT和OAuth2的关系,两者其实是没有关系的)
6.JSON Web Token 入门教程 阮一峰的网络日志。

其他相关文章

根据查阅资料,在网关中使用security和在普通的springboot应用程序中使用security还是有点不一样的。首先一点就是注解的不一样,在gateway中使用的是@EnableWebFluxSecurity,而在普通的web应用程序中使用的是@EnableWebSecurity

参考文章:
1.Spring Cloud Gateway全局过滤器GlobalFilter:返回消息和重定向
2.spring - Spring Webflux安全中的角色层次结构
3.AuthenticationManager、ProviderManager (这个讲了AuthenticationManage、ProviderManager以及AuthenticationProvider三者之间的关系,总结起来,就是Security认证会交给AuthenticationManage接口,因为ProviderManager是其实现接口,于是就使用了ProviderManage进行认证管理,在ProviderManage中,会调用所有实现了AuthenticationProvider接口的子类中的support函数,如果认证时匹配到了这个认证其)
4.SpringCloud Alibaba微服务实战十四 - SpringCloud Gateway集成Oauth2.0
5.springCloud gateway+jwt方式做token校验 (这个其实还是没有结合spring security)
6.SpringCloud Gateway整合Spring Security Webflux的关键点(痛点解析),及示例项目 (讲了在使用webflux时)
7.1.Spring Cloud Gateway及Security认证 (这篇文章有点乱写的,其实根本就没有gateway和security结合,最明显的就是在gateway中不能使用@EnableWebSecurity,而应该使用的是@EnableWebFluxSecurity)
8.Spring gateway配置Spring Security实现统一权限验证与授权
9.Spring Cloud下微服务权限方案 (这篇文章讲了微服务架构下的权限认证方案的探讨,最后呢,还提供了一个Cloud-Platform通用脚手架)

oauth2和jwt

在谷歌中搜索springcloud gateway加security,最后都被导向了spring gateway+spring security oauth2,不知道是不是我的方向不对,总感觉有什么地方出现了问题。现在脑子里一片浆糊,不知道是不是不应该在spring gateway中加入spring security。

参考文章:
1.通过springcloud gateway优雅的进行springcloud oauth2认证和权限控制 (就像这篇文章一样,最后都会有一个oauth2加进来,但是我不愿意引入这个模式啊)
2.SpringCloud系列三:SpringSecurity 安全访问(配置安全验证、服务消费端处理、无状态 Session 配置、定义公共安全配置程序类)
3.从零开始的Spring Security Oauth2(一) (这里在讲如何使用security进行oauth2开发的例子)
4.Spring Boot Security Oauth2之客户端模式及密码模式实现 (多认证模式)
5.Spring security oauth2-客户端模式,简化模式,密码模式(Finchley版本) (这篇文章对于一些必选参数和可选参数都讲的很明确。)
6.oauth2.0通过JdbcClientDetailsService从数据库读取相应的配置 (如何从数据库中读取授权信息,从而实现动态的创建授权码,通过client_id和client_secret访问oauth2服务)
7.Spring Security OAuth2之scopes配置详解 (OAuth2中scopes的含义,但是没有解决我对如何设置scopes的疑问)

jwt加密

对生成对token进行解密查看,可以到网站JSON Web Tokens (JWT) 在线解密进行,但是默认生成到jwt是不加密到,所以,自动解析了。就可以看到明文,所以在pload部分,不建议存储敏感信息。如何进行jwt加密呢?

根据我的理解,就是JWT中的header和pload部分,都是使用base64进行编码的明文,所以无法进行加密处理,并且最好不要存储敏感的信息。但是在第三部分签证(signature),这部分有一个地方是存储密钥的地方,这个在服务端进行存储,使用这个进行解码整个token的内容,是不是正确的,所以也算是对整个token进行了一种加密验证了,因为无法伪造这个 secret ,所以整个的token也就无法伪造了。

参考文章:
1.JavaToken认证JWT加密
2.JWT及JWT伪造 这里有JWT安全问题说明、JWT token破解绕过、JWT伪造方法。

参考文章:
1.使用spring security + JWT 权限认证
2.Spring Security 在 Spring Boot 中集成 JWT + RSA【分布式】
3.Spring Security+OAuth2 + JWT认证以及携带用户信息 这里写了两种方式,一种就是对称加密,一种就是非对称加密的方面。
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。