安全相关的代码和业务逻辑相关的代码实际上是在一个应用里面的,在这个应用里面,我们需要去,这个应用本身的处理逻辑里面需要去处理令牌和用户信息之间的转换。

然后我们需要去知道认证服务器的地址,这些都是耦合。

虽然我们把server.resource这里面的代码提炼成一个公用的jar包

把这些clientId和ClientSecret这些做成配置。然后让各个应用去依赖这个jar包,写不同的配置来实现这样的效果。但实际上本质是没变的。它的安全处理逻辑和你的业务逻辑仍然是在一个应用里面的。在一个应用里面,这就是一种耦合。我们之前说过在微服务环境下解耦是价值最大的一件事。

那么什么叫做安全处理和业务逻辑耦合呢???
举个例子,以为大家刚开始接触这个东西,用的是一个比较简单的获取令牌的方式,验令牌的时候也需要验证服务器,随着我们的规模扩大,我们需要一种新的认证方式。,或者说比如我的令牌是存在数据库的 可能以后会改成jwt或者其他的。或者我一开始下用的jwt,后来jwt有安全漏洞需要升级,不管是前面说的那种情况,只要你的安全相关的逻辑发生了变化,你就要升级你提炼出去的那个jar包,你要告诉所有的微服务的团队,你们要升级你们的安全的扎包,这就意味着这些开发微服务的团队在自己业务没有变化的情况下,他要因为你安全处理这方面的逻辑变化,而重新部署,可能还要改相应的配置或者代码等等一些东西。这个在一个比较复杂的微服务环境里面。一些互联网企业可能有几百上千甚至上万的微服务是不可接受的。因为影响面太大了。我们说安全处理和业务逻辑是耦合的,一旦有变化,影响面会非常大。

二是随着业务节点的增加认证服务的压力变大。我们这里验证token实际上是有一个http的请求连接过去的。当然我们可以通过连接池啊之类的技术来限制这个链接的数量,来控制服务器的压力。但是你的微服务本身它是不断的变化的。比如他原来是10个服务,可能过两天,随着业务的发展,10个服务拆成10个服务,或者拆成50个服务。某些服务在某些场景下它也会做去做扩充,比如说明天要大促,那你所有的节点,尤其是关键业务的节点。要部署的节点的数量要加倍。在这样一个场景下的,你的服务器的数量,一直在增长增长。在某些情况下还会快速增长,比如说某些大促的活动。这时候可能你原来能撑住的服务器的压力,因为你的微服务去增长去扩充容,结果他们连过来的连接数,超出了你认证服务器所能承受的连接数,把你认证服务器压死了。把你认证服务器链接都占满了。导致你的认证服务器不可用,然后所有需要依赖认证服务器的做的这些事情,全都不能做了整个都崩掉了。这也是一个在微服务环境下,一个很大的风险。

最后一个就是 多个服务同时暴露,增加了外部访问的复杂性,

从图上可以看到我们的客户端应用和我们的服务是直接打交道的。如果我这是几十个服务,每个服务都有自己的ip,或者说有自己的域名,那么对于我的客户端应用来说,我要访问访问订单服务,要访问这个服务、那个服务,对于我的客户端来说,我要记很多的东西。这就是增加了外部访问的复杂性。

网关

由网关来解决上面的这些问题。所有安全处理的逻辑全都放在网关上面来了。在订单服务里面不再有和安全处理相关的逻辑,它里面就只有业务逻辑。这个令牌怎么拿到,然后这个令牌是不是有效,全都在网关这里来做判断,一旦过了在订单服务这里只执行订单相关的业务逻辑,

网管的扩缩容比微服务的频率要小的多。
对个微服务现在只要 记住一个网关的地址,所有的请求和交互都是和网关交互,网关知道这些微服务在哪。
应用只知道客户端应用,

网关的搭建


原来都拷贝进来。

先把oauth2的依赖去掉。

先把网关搭建起来,让客户端应用只访问网关就可以访问到认证服务器和微服务。注意的一点,认证服务器也是要放在网关后面的。

添加网关zuul的引用


建启动类

加上@EnbaleZuulProxy它就是一个网关了。

那么代码就写完了。

配置

网关没有什么业务逻辑,主要地方就是在配置,通用的已经被封装好了。

首先来配置一下转发的逻辑,路由 路由后面是一个Map,表示可以有多个。

首先是要转发token ,转发给9090端口

order的转发

网关自己跑在9070的端口上。

敏感头

设置为空表示没有任何的头对我来说是敏感头。也就是说 头里的任何信息都往后转发。这样的话,服务才能通。

如果不设置敏感头的话,这个Authorization是转发不过去的。

启动网关服务


认证服务器启动起来。

订单服务 启动起来。

发送到localhost:9070/token这个路径下 后面的路径 oauth/token才是认证服务的路径。

200就说明转发成功了。

拿这个token再来调用一下创建订单的服务。


成功

结束

Spring cloud微服务安全实战-4-8Zuul网关安全开发(一)的更多相关文章

  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微服务安全实战-4-9Zuul网关安全开发(二)

    把在微服务里面写的安全的相关逻辑挪到网关里面来.这样把安全逻辑和业务逻辑解耦开.那么这些问题就都解决了. 先来看下之前的安全的代码,首先在之类做了认证,认证服务器去认证,拿这个token去换用户信息. ...

  5. Spring Cloud微服务安全实战_4-5_搭建OAuth2资源服务器

    上一篇搭建了一个OAuth2认证服务器,可以生成token,这篇来改造下之前的订单微服务,使其能够认这个token令牌. 本篇针对订单服务要做三件事: 1,要让他知道自己是资源服务器,他知道这件事后, ...

  6. Spring Cloud微服务安全实战_4-3_订单微服务&价格微服务

    实现一个场景: 订单微服务: POM: <?xml version="1.0" encoding="UTF-8"?> <project xml ...

  7. Spring cloud微服务安全实战 最新完整教程

    课程资料获取链接:点击这里 采用流行的微服务架构开发,应用程序访问安全将会面临更多更复杂的挑战,尤其是开发者最关心的三大问题:认证授权.可用性.可视化.本课程从简单的API安全入手,过渡到复杂的微服务 ...

  8. Spring cloud微服务安全实战-6-8sentinel限流实战

    阿里2018年开源的. 简单来说就是干三件事,最终的结果就是保证你的服务可用,不会崩掉.保证服务高可用. 流控 先从最简单的场景来入手. 1.引用一个依赖, 2,声明一个资源. 3.声明一个规则 注意 ...

  9. Spring cloud微服务安全实战-6-4权限控制改造

    授权,权限的控制 令牌里的scope包含fly就有权限访问.根据Oauth的scope来做权限控制, 要让@PreAuthorize生效,就要在启动类里面写一个注解. 里面有一个属性叫做,就是在方法的 ...

随机推荐

  1. 【Python】编程小白的第一本python(最基本的魔法函数)

    Python官网中各个函数介绍的链接:https://docs.python.org/3/library/functions.html 几个常见的词: def (即 define,定义)的含义是创建函 ...

  2. cookie,session,token介绍

    本文目录 发展史 Cookie Session Token 回到目录 发展史 1.很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, 不需要记录谁在某一段时间里都浏览了什么文档 ...

  3. norm()函数

    n = norm(v) 返回向量 v 的欧几里德范数.此范数也称为 2-范数.向量模或欧几里德长度. 例1: K>> norm([3 4]) ans = 5

  4. LightOJ - 1095 - Arrange the Numbers(错排)

    链接: https://vjudge.net/problem/LightOJ-1095 题意: Consider this sequence {1, 2, 3 ... N}, as an initia ...

  5. 2019/8/20 Test

    题目 简述 做法 \(BSOJ2237\) 求\(\displaystyle{k\in G:\sum_{i\in G\vee j\in G}\frac{C^k_{i,j}}{C_{i,j}}}\),其 ...

  6. CocoaPods加载第三方库

    http://code4app.com/article/cocoapods-install-usage

  7. 汇编语言笔记 CALL和RET指令

    转载地址:http://www.cnblogs.com/dennisOne ☞模块化程序设计 模块化程序设计 汇编语言通过call和ret指令实现了模块化程序设计.可以实现多个相互联系.功能独立的子程 ...

  8. Subspace Subcode

    子码(subcode)的概念来自信息编码,不太容易理解.通常是子域编码(subfield subcode),也可以扩展到子空间编码(subspace subcode). 子空间或者子域编码的一个基本想 ...

  9. PHP隐藏入口脚本文件index.php

    一.nginx下 隐藏入口文件时,配置nginx 首先得开启nginx pathinfo模式: location ~ \.php { #去掉$ root E:/phpStudy/WWW/tp/publ ...

  10. Python和多线程(multi-threading)。这是个好主意码?列举一些让Python代码以并行方式运行的方法。

    Python并不支持真正意义上的多线程.Python中提供了多线程包,但是如果你想通过多线程提高代码的速度,使用多线程包并不是个好主意.Python中有一个被称为Global Interpreter ...