网关上认证去做哪些改造
在网关上用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. 《你说对就队》第九次团队作业:【Beta】Scrum meeting 2

    <你说对就队>第九次团队作业:[Beta]Scrum meeting 2 项目 内容 这个作业属于哪个课程 [教师博客主页链接] 这个作业的要求在哪里 [作业链接地址] 团队名称 < ...

  2. 《发际线总是和我作队》第九次团队作业:Beta冲刺Scrum Meeting2

    项目 内容 这个作业属于哪个课程 软件工程 这个作业的要求在哪里 实验十三 团队作业9:Beta冲刺与团队项目冲刺 团队名称 发际线总和我作队 作业学习目标 (1)掌握软件黑盒测试技术:(2)掌握软件 ...

  3. python列表命令

    创建普通列表:member;: 创建混合列表:mix: 创建空列表:empty >>> member = ['lala','oo'] >>> member ['la ...

  4. React vs Angular vs Vue 2019

    React vs Angular vs Vue 看待这三个主流框架给出的想法 Angular is the entire kitchen that gives you all the tools ne ...

  5. Codevs 2185【模板】最长公共上升子序列

    题目描述 Description 熊大妈的奶牛在小沐沐的熏陶下开始研究信息题目.小沐沐先让奶牛研究了最长上升子序列,再让他们研究了最长公共子序列,现在又让他们要研究最长公共上升子序列了.小沐沐说,对于 ...

  6. 洛谷P1019 单词接龙题解(超详细注释)

    https://www.luogu.org/problem/P1019 #include<cstdio> #include<cstring> #include<iostr ...

  7. mysql 索引基本概念

    1. 什么是索引? 索引是一种数据结构,可以帮助我们快速的进行数据的查找. 2. 索引是个什么样的数据结构呢? 索引的数据结构和具体存储引擎的实现有关, 在MySQL中使用较多的索引有Hash索引,B ...

  8. 7中漂亮的纯css字体

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. 使用composer下载依赖包下载失败的解决方法

    下载好的composer默认的下载地址是国外的,在下载的过程中网络不好或者可能被墙,将下载的地址换成国内的地址即可 有两种方式启用本镜像服务: 系统全局配置: 即将配置信息添加到 Composer 的 ...

  10. 【CSP模拟赛】Adore(状压dp 二进制)

    题目描述 小w偶然间见到了一个DAG.这个DAG有m层,第一层只有一个源点,最后一层只有一个汇点,剩下的每一层都有k个节点.现在小w每次可以取反第i(1<i<n-1)层和第i+1层之间的连 ...