网关上认证去做哪些改造
在网关上用jwt去解析用户信息,而不再发送校验令牌的请求了。

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

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

这俩是审计日志和授权。

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

限流

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

用Spring Security实现功能

加入Starter-oauth2的依赖。

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

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

tokenKey源码在这里

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

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

上节课配置tokenStore的时候

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

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


网关就是gateway密码是123456

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

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

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


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

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

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

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

order-api

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

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


在启动类里面加注解@EnableResourceServer

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

启动测试

启动网关

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

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

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

然后再启动网关、

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

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

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

tokenKeyEndpoint这个端点才会起作用。

这个请求才会被处理

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

重启认证服务器

网关重启

网关就能成功的启动了。

启动orderapi

首先来获取令牌


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

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

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

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

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

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

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

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

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

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

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

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

解决方法

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

然后把网关的resourceId配置成gateway


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

这种方式的好处就是你可以控制权限。这个令牌能访问谁,不能访问谁,自己可以控制。不好的地方就是麻烦,每次都要自己改数据,代码里还要做相应的编码。
比如说这里的名字你编译下,数据库内的数据也要跟着改。这样还是需要一些维护的工作的。

另外一种方式


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

配置gateway的resourceId也去掉。

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

重新测试

重新申请令牌。

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

访问创建订单的服务。


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

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

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

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

价格服务

价格服务也加上oauth2的依赖

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


数据库内没有priceService

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

获取用户名

输出用户名

修改orderController

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

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

在springboot的启动类声明oauth2RestTemplate

这个方法。
需要用到两个参数。

进入到OAuth2RestTemplate这个类里面。

复制这两个参数出来。

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

启动测试

orderAPi和priceAPI都启动起来。
听过网关来调创建订单。


priceAPi的控制台

结束

Spring cloud微服务安全实战-6-3JWT改造之网关和服务改造的更多相关文章

  1. 《Spring Cloud微服务 入门 实战与进阶》

    很少在周末发文,还是由于昨晚刚收到实体书,还是耐不住性子马上发文了. 一年前,耗时半年多的时间,写出了我的第一本书<Spring Cloud微服务-全栈技术与案例解析>. 时至今日,一年的 ...

  2. Spring Cloud微服务安全实战_00_前言

    一.前言: 一直以来对服务安全都很感兴趣,所以就学习.这是学习immoc的 jojo老师的 <Spring Cloud微服务安全实战课程>的笔记,讲的很好. 课程简介:  二.最终形成的架 ...

  3. Spring cloud微服务安全实战_汇总

    Spring cloud微服务安全实战 https://coding.imooc.com/class/chapter/379.html#Anchor Spring Cloud微服务安全实战-1-1 课 ...

  4. Spring Cloud微服务Sentinel+Apollo限流、熔断实战总结

    在Spring Cloud微服务体系中,由于限流熔断组件Hystrix开源版本不在维护,因此国内不少有类似需求的公司已经将眼光转向阿里开源的Sentinel框架.而以下要介绍的正是作者最近两个月的真实 ...

  5. Spring Cloud微服务系列文,服务调用框架Feign

    之前博文的案例中,我们是通过RestTemplate来调用服务,而Feign框架则在此基础上做了一层封装,比如,可以通过注解等方式来绑定参数,或者以声明的方式来指定请求返回类型是JSON.    这种 ...

  6. 放弃Dubbo,选择最流行的Spring Cloud微服务架构实践与经验总结

    http://developer.51cto.com/art/201710/554633.htm Spring Cloud 在国内中小型公司能用起来吗?从 2016 年初一直到现在,我们在这条路上已经 ...

  7. Spring Cloud 微服务的那点事

    什么是微服务 微服务的概念源于2014年3月Martin Fowler所写的一篇文章“Microservices”. 微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调 ...

  8. Spring Cloud 微服务架构解决方案

    1 理解微服务 1.1 软件架构演进 软件架构的发展经历了从单体结构.垂直架构.SOA架构到微服务架构的过程. 1.1.1 单体架构 特点: 1.所有的功能集成在一个项目工程中. 2.所有的功能打一个 ...

  9. Spring Cloud 微服务

    https://mp.weixin.qq.com/s?__biz=MzU0OTE4MzYzMw==&mid=2247486301&idx=2&sn=f6d45860269b61 ...

  10. 一张图了解Spring Cloud微服务架构

    Spring Cloud作为当下主流的微服务框架,可以让我们更简单快捷地实现微服务架构.Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟.经得起实际考验的服务框架组合起来 ...

随机推荐

  1. 零基础Python教程-详说list有序集合

    list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出你周围同事的名字,就可以用一个list表示: >>> classmates = ['Michael', 'Bob' ...

  2. 《CoderXiaoban》第八次团队作业:Alpha冲刺5

    项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 实验十二 团队作业8:软件测试与ALPHA冲刺 团队名称 Coderxiaoban团队 作业学习目标 (1)掌握软件测试基 ...

  3. Alpha冲刺随笔六:第六天

    课程名称:软件工程1916|W(福州大学) 作业要求:项目Alpha冲刺(十天冲刺) 团队名称:葫芦娃队 作业目标:在十天冲刺里对每天的任务进行总结. 随笔汇总:https://www.cnblogs ...

  4. 正确理解cookie和session机制原理

    php中cookie和session是我们常用的两个变量了,一个是用户客户端的,一个用在服务器的但他们的区别与工作原理怎么样,下面我们一起来看看cookie和session机制原理吧. cookie和 ...

  5. vue3 RFC初尝试

    由于vue3.x还没有正式发布,所以可以通过安装包vue-function-api提前尝试 npm install vue-function-api --save main.js import Vue ...

  6. Hive节点及原理

    1.什么是Hive:hive是一种基于hadoop的数据仓库,能够将结构化的数据映射成一张表,并提供HQL进行查询.其数据是存储在hdfs上,本质是将sql命令转化成MapReduce来执行. 2.H ...

  7. AtomicIntegerFieldUpdater字段原子更新类

    本文链接:https://blog.csdn.net/anLA_/article/details/78662383前面讲的两个AtomicInteger和AtomicIntegerArray,这两个都 ...

  8. learning java AWT 画图

    import javax.swing.*; import java.awt.*; import java.util.Random; public class SimpleDraw { private ...

  9. zabbix sender

    在zabbix中自定义一个虚拟主机,自定义key值,一般运用的是自动发现规则,给清单规则中配置上宏变量,通过py脚本调动zabbixsender模块,给这个主机,host发送一组包含键和宏变量的值,这 ...

  10. 9、共享变量(Broadcast Variable和Accumulator)

    一.共享变量 1.共享变量工作原理 Spark一个非常重要的特性就是共享变量. 默认情况下,如果在一个算子的函数中使用到了某个外部的变量,那么这个变量的值会被拷贝到每个task中.此时每个task只能 ...