用户修改了信息jwt服务器怎么识别,Spring cloud微服务安全实战-6-3JWT改造之网关和服务改造...

网关上认证去做哪些改造

在网关上用jwt去解析用户信息,而不再发送校验令牌的请求了。

之前的时候网关上实际上写了很多的代码

b17f312322b76e1eb5ddac8d4d1c2d7d.png

包括认证,发check_token去把token请求,换成用户信息。

9e40ea2263a6ccf298f494b339231d5a.png

这俩是审计日志和授权。

84014ca7e9ebf92031ea5fb5e06c02d6.png

自己写了个MeFilter获取用户的信息

fd5e8e8bfe06009561e3d8e272e3a2e0.png

限流

8c4de5c691cadcdc1ffe106a9e6bc594.png

filter都删掉,Spring Security和Spring OAuth 已经把所有的都封装好了。除了限流和日志。审计、认证、授权都封装好了。

77b3a59cecbfd599bf65a3690865e96a.png

用Spring Security实现功能

加入Starter-oauth2的依赖。

cf43bbab097a764c1b8ded6abd2760a2.png

本节课先讲认证相关的功能。我们现在不再发校验令牌的请求,而是直接从jwt里面读取用户的信息,jwt的信息会有一个签名,读取信息的时候要去验这个签名,验签名的时候需要有一个key,key我们需要在Gateway启动的时候,从认证服务器获取到这个key

2b4ed6d5673d7ba6076083b7bb43c361.png

key-uri首先要配置从哪里拿key。这里应该配置的是认证服务器的地址。

f3acc713e3c157caaf9e8c1abcd6a7a9.png

363bae6977896cb62959b1d288337468.png

tokenKey源码在这里

f4de660ae6758ae9b4b9c12f28163347.png

TokenKeyEndpoint来处理,/oauth/token_key这个请求。

bcae1e5c962faf5be768f122fb2829d1.png

它就会把证书里面存的密钥返回

3711f501e336c6b7ac3427b4335e79e3.png

上节课配置tokenStore的时候

22f3814982b5f5657b954332debdcaf2.png

下面配置配置了tokenKeyAccess。就是说访问这个tokenKeyUrl的时候必须要身份认证。

d55dc1c6de9f18dc94eec48fe3da0709.png

所以在这里我就要告诉他身份认证的信息。clinetId和clientSceret

5b0a9da48ec5bbda445ddfb70c822ec1.png

bcf75324be944da7a04cb35a85f98cd3.png

网关就是gateway密码是123456

f2831b51412241eddb945c20be11441e.png

这和我们数据库的记录是对应的。数据库内有这条记录才会生效。

ea7e089b27b5770004caea1e3b6367b8.png

配置资源服务器相关的配置

网关是作为资源服务器存在的,所以继承ResourceServerConfigAdapter

4fd333c643a2b0f3b48109ec46aca9a9.png

496cabe8761f302618bce6d2774aef5c.png

da7255abcfc7cd7b37d9608d1bc9dca6.png

我们自己写的认证的时候,我们要把所有/token的请求都放过去,因为/token开头的请求都是在申请令牌,你不能让申请令牌的这些请求也需要身份认证。

5f7c02afc941a68b9e22a14c247c5488.png

默认情况下所有的请求都需要身份认证。

96cf3ebc67f11442851a3472dd6a6fca.png

我们在这里 加一句,申请令牌的所有请求都放行。不需要带令牌。

45e03437dd27dd706c09a7fd342de298.png

如果你还有其他的路径需要放行的直接在这里逗号分隔开 继续加字符串就可以了。这里的antMathers是个复数的形式。

018da8773d9c4d4e59a9009d08f56c03.png

order-api

我们在网关里面把filter都去掉了。已经不再传明文的username了。这个时候order-api也需要修改代码

因为oauth2的依赖。

5851c7a2675c2161a2cb5066f9bb03a8.png

也需要响应的配置,令牌传递过来,它也需要从令牌里解析当前用户是谁。因为我们传的是一个令牌,而不是明文的一个东西了。

6f5e29ce56b99cfef65af3c517346599.png

a8d09493c48a0f2c86fa9d5c1bc921e5.png

在启动类里面加注解@EnableResourceServer

1b7ff48ca86b2ec55fef7dc12a2b3837.png

拿到用户名,通过@AuthenticationPrincipal注解

6ec148c5b82e1c1959ae824366a2b100.png

启动测试

启动网关

21bc1ffbfaf09e42e057f1945b5708aa.png

在没有启动认证服务器的时候,直接启动网关 会报错。链接被拒绝,

51fa36c204be73c601212386cc8e7e53.png

它在启动的时候会去找认证服务器,拿签名的key。认证服务器如果还没有启动,连不上,所以会报错。你拿不到这个key 就没法验jwt

a4ea0be4e828cfc3ecd9738cd12e42c9.png

所以首先启动认证服务器,OAuth2的认证服务器。

5afd5f392c11ab1ae959cb2e36e8cb3d.png

然后再启动网关、

7152736c337b6851369b7c607019728d.png

再次启动网关的时候又报了个404的错误。就是刚才那个拿key的路径没有。

1c058e8e1dad7b0efe4401262dfd6335.png

这是因为我们在配置Oauth2认证服务器的时候,改tokenStore的时候,声明的是私有的JwtAccessTokenConverter

925b786675d345aaff779579e2065427.png

这个类要声明称公有的,而且还要是Spring的一个Bean。只有在有这个Bean的情况下。

0884761a2801cb7584bb116301f26822.png

tokenKeyEndpoint这个端点才会起作用。

cbe0ebee460e0b437c67fa45d713642b.png

这个请求才会被处理

e8e66f3eff6c8ed78f35b0ec2a4461f7.png

如果没有这个public的Bean。这个端点是不会暴露的,所以就会报404 的错误。

704f720de36f3ea78c23f7b3af30c74e.png

重启认证服务器

5cbe4882ce6b17e8e17628cc8eb3c92d.png

网关重启

f162acccae75e52395cecfb75db10789.png

网关就能成功的启动了。

启动orderapi

a024e6288fb6473af6f607117c7092f6.png

首先来获取令牌

8682ac621138973201e7bee342d33cb7.png

74b0233ab759b50b685fbc23bb3d6733.png

我把数据库内的令牌的过期时间改了 之前为了测试改的10秒。这次再改的长一点。

c6ce8f2a2b27c43e911bad9d3a48a11a.png

通过网关调用创建订单的服务

c2d38b05d13c27785f55dcfeef2600d5.png

403错误。无效的token,不包含resource id oauth2-resouce 这说明我们的resouceid的检查没过。

4ba3331aea0ce4e1741fccbe34783bfc.png

针对admin发出去的令牌,它的resource_id是order-server

dfe48413b9db03636657cd7466676e97.png

报错的oauth2-server是哪里的呢???我们在配置网关的时候,没有指定resource_id

75a759e6bd862c376b52a72511ae6f8e.png

默认情况下没有指定resourceId的情况,这个类里面会有一个默认的resourceId.进入到ResourceServerSerurityConfigurer

c6e6bdd7615f4745ffc8ab01e0daba70.png

因为网关没有配置,所以默认的就是这个类里的resourceId,oauth2-resource

2d2b7b1a14873da0d2b1b201a7ca2461.png

我们在发出去的令牌只能访问order-server

b6c6c2d04483f4a1eb767a0654cfe3df.png

所以这个令牌在访问网关的时候,就被拦下来了。令牌是对的。但是没有权限。

ca5eca311fe64f2c820a2ae9556c669c.png

令牌随便加个字母访问,错误的令牌就是401

8d60873df1416990681929b4e1108a8a.png

令牌都没过,无法从令牌里面知道你是谁。invalid_token无效的令牌。

2dfccabb1769a26542f5f5343d4cf25c.png

我们之前在网关上做的认证和权限判断,就是返回401和403两个事,实际上,spring  security已经帮我们都做了。

我们看到了它上面基友401认证的判断,也有403权限的判断。

解决方法

在数据库内,这里加一个gateway

3212810df42bebd1af9b4397ab0c8517.png

然后把网关的resourceId配置成gateway

93018a9228b5158302306f73e964364e.png

14b0b5184720c17d3bfd0f6aa4e72305.png

再重新发一个令牌,这个令牌再去访问网关,就可以过去了。

74138fbea02f0351aec5e59fbf847885.png

这种方式的好处就是你可以控制权限。这个令牌能访问谁,不能访问谁,自己可以控制。不好的地方就是麻烦,每次都要自己改数据,代码里还要做相应的编码。

比如说这里的名字你编译下,数据库内的数据也要跟着改。这样还是需要一些维护的工作的。

3fef584cec245ef4d697159574a7d88e.png

另外一种方式

数据库内 这里啥都不填,这样发出去的令牌就可以访问所有的resourceId

b2582184be98beacb64b3f42d1652907.png

配置gateway的resourceId也去掉。

7bf510763ce40469bcd723767cd7bfd9.png

这里我们就是通过数据库配置为空的方式了。

重新测试

重新申请令牌。

8c35744b56db0dfd835c739adf77545f.png

新凌派就是可以访问任何的资源服务器。

407a16d746ac5715dbb31f6cb47e684f.png

访问创建订单的服务。

dd2d8afd702bf88a2c4bbcda18727ce6.png

eb6a0853597f71b76cc369004f26171d.png

创建订单的控制台,把用户名打印出来。

2422a175689be51bcfbca81b3f3bf82a.png

39d0410817ad9fcf508b835bc864917f.png

发了jwt后,在网关的时候,没有去校验令牌,在网关解析了jwt,判断这个jwt是有效的,再往下,jwt给到订单服务的时候,订单服务从jwt解析出来这个令牌对应的用户是jojo

d6523a85742ee01c9b9dd923018b6aec.png

1b2162ba77aa2091b73fc2abac7b3f83.png

解决最后一个问题,令牌如何传递

订单服务想去调库存服务的时候,令牌如何往下传。仍然要从请求里面拿到令牌,放到请求头里。但是spring security已经帮我封装了。不用自己去做。只需要用他的一个工具类就可以了。

价格服务

价格服务也加上oauth2的依赖

09f71b58003a6cbd7b11a0a3ce04c3bf.png

加上配置,配置从哪里拿tokenKey

07ebc24183330e004bb7be62cd577982.png

c9d5e326a0a51e8fc304a7aa85866e1a.png

数据库内没有priceService

46e4968f2b22294da63377a57e39759f.png

把orderApp改成priceService ,密码是复制上面gateway的密码。

ff636cc700fc917783061c1657d7a3a3.png

获取用户名

619f3373eb50fea3e5a4f17d29cfb371.png

输出用户名

bb56d80562699f92d09865031029927e.png

修改orderController

在请求上把令牌带上。不再用原来的restTemplate了 ,而是用SpringSecurity提供的OauthRestTemplate

b4f9a2a46843120d7df654839c9a2775.png

OauthRestTemplate功能就是从你当前请求的上下文里,拿到令牌,然后把令牌放到请求头里面。然后再出去。只要用OauthRestTemplate来发请求就会自动带上请求头。

b65d89d268097c85dbe87767e0994f16.png

在springboot的启动类声明oauth2RestTemplate

1cec6350a934f3720c56b4f125fe895f.png

这个方法。

需要用到两个参数。

4922511d74ce3cd35a3eaaad16899cfe.png

进入到OAuth2RestTemplate这个类里面。

10b00199c84b4e892a9f184de9f528fc.png

复制这两个参数出来。

96277bf2838525360cc03a112097714b.png

43847b458a7022f5d779819b7261a133.png

复制到方法的参数里就可以了。这两个参数springboot已经帮我们声明好了。直接写在方法参数里,springboot就会替我们把这俩参数传进来。

然后直接传给这个OAuth2ResetTemplate就可以了。

5534149b45bd68b937e250fffa7c6e12.png

启动测试

orderAPi和priceAPI都启动起来。

听过网关来调创建订单。

196e4a8ddab2e6b2e5d52504a86af1ae.png

050708b61d2fc12512e6abecae82b356.png

priceAPi的控制台

3c4981602eee2ae42d3c8db03d07e11b.png

结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值