Spring cloud微服务安全实战-6-3JWT改造之网关和服务改造
网关上认证去做哪些改造
在网关上用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改造之网关和服务改造的更多相关文章
- 《Spring Cloud微服务 入门 实战与进阶》
很少在周末发文,还是由于昨晚刚收到实体书,还是耐不住性子马上发文了. 一年前,耗时半年多的时间,写出了我的第一本书<Spring Cloud微服务-全栈技术与案例解析>. 时至今日,一年的 ...
- Spring Cloud微服务安全实战_00_前言
一.前言: 一直以来对服务安全都很感兴趣,所以就学习.这是学习immoc的 jojo老师的 <Spring Cloud微服务安全实战课程>的笔记,讲的很好. 课程简介: 二.最终形成的架 ...
- Spring cloud微服务安全实战_汇总
Spring cloud微服务安全实战 https://coding.imooc.com/class/chapter/379.html#Anchor Spring Cloud微服务安全实战-1-1 课 ...
- Spring Cloud微服务Sentinel+Apollo限流、熔断实战总结
在Spring Cloud微服务体系中,由于限流熔断组件Hystrix开源版本不在维护,因此国内不少有类似需求的公司已经将眼光转向阿里开源的Sentinel框架.而以下要介绍的正是作者最近两个月的真实 ...
- Spring Cloud微服务系列文,服务调用框架Feign
之前博文的案例中,我们是通过RestTemplate来调用服务,而Feign框架则在此基础上做了一层封装,比如,可以通过注解等方式来绑定参数,或者以声明的方式来指定请求返回类型是JSON. 这种 ...
- 放弃Dubbo,选择最流行的Spring Cloud微服务架构实践与经验总结
http://developer.51cto.com/art/201710/554633.htm Spring Cloud 在国内中小型公司能用起来吗?从 2016 年初一直到现在,我们在这条路上已经 ...
- Spring Cloud 微服务的那点事
什么是微服务 微服务的概念源于2014年3月Martin Fowler所写的一篇文章“Microservices”. 微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调 ...
- Spring Cloud 微服务架构解决方案
1 理解微服务 1.1 软件架构演进 软件架构的发展经历了从单体结构.垂直架构.SOA架构到微服务架构的过程. 1.1.1 单体架构 特点: 1.所有的功能集成在一个项目工程中. 2.所有的功能打一个 ...
- Spring Cloud 微服务
https://mp.weixin.qq.com/s?__biz=MzU0OTE4MzYzMw==&mid=2247486301&idx=2&sn=f6d45860269b61 ...
- 一张图了解Spring Cloud微服务架构
Spring Cloud作为当下主流的微服务框架,可以让我们更简单快捷地实现微服务架构.Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟.经得起实际考验的服务框架组合起来 ...
随机推荐
- 《你说对就队》第九次团队作业:【Beta】Scrum meeting 2
<你说对就队>第九次团队作业:[Beta]Scrum meeting 2 项目 内容 这个作业属于哪个课程 [教师博客主页链接] 这个作业的要求在哪里 [作业链接地址] 团队名称 < ...
- 《发际线总是和我作队》第九次团队作业:Beta冲刺Scrum Meeting2
项目 内容 这个作业属于哪个课程 软件工程 这个作业的要求在哪里 实验十三 团队作业9:Beta冲刺与团队项目冲刺 团队名称 发际线总和我作队 作业学习目标 (1)掌握软件黑盒测试技术:(2)掌握软件 ...
- python列表命令
创建普通列表:member;: 创建混合列表:mix: 创建空列表:empty >>> member = ['lala','oo'] >>> member ['la ...
- React vs Angular vs Vue 2019
React vs Angular vs Vue 看待这三个主流框架给出的想法 Angular is the entire kitchen that gives you all the tools ne ...
- Codevs 2185【模板】最长公共上升子序列
题目描述 Description 熊大妈的奶牛在小沐沐的熏陶下开始研究信息题目.小沐沐先让奶牛研究了最长上升子序列,再让他们研究了最长公共子序列,现在又让他们要研究最长公共上升子序列了.小沐沐说,对于 ...
- 洛谷P1019 单词接龙题解(超详细注释)
https://www.luogu.org/problem/P1019 #include<cstdio> #include<cstring> #include<iostr ...
- mysql 索引基本概念
1. 什么是索引? 索引是一种数据结构,可以帮助我们快速的进行数据的查找. 2. 索引是个什么样的数据结构呢? 索引的数据结构和具体存储引擎的实现有关, 在MySQL中使用较多的索引有Hash索引,B ...
- 7中漂亮的纯css字体
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 使用composer下载依赖包下载失败的解决方法
下载好的composer默认的下载地址是国外的,在下载的过程中网络不好或者可能被墙,将下载的地址换成国内的地址即可 有两种方式启用本镜像服务: 系统全局配置: 即将配置信息添加到 Composer 的 ...
- 【CSP模拟赛】Adore(状压dp 二进制)
题目描述 小w偶然间见到了一个DAG.这个DAG有m层,第一层只有一个源点,最后一层只有一个汇点,剩下的每一层都有k个节点.现在小w每次可以取反第i(1<i<n-1)层和第i+1层之间的连 ...