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

认证完成后,又在这里做了个简单的授权,盘点当前的用户是不是有读权限和 写权限。

在这里还根据resourceId有一个简单的权限控制,就是我的令牌只能访问哪些resourceServer

之前基本上做的就是认证和授权,在网关上,所有的请求都要走网关转到这个微服务上。所以在网关上不光要做认证和授权,之前说的认证机制都要加到网关上,包括限流。

网关上写代码-认证

写认证授权相关的东西。
建一个新的filter包

写一个filter


要继承ZuulFilter

@Component声明称一个Spring的组件

任何一个继承了ZuulFilter的过滤器都会有四个方法需要覆盖。


写一段逻辑判断过滤器是不是要起作用,这里我们返回true。就是永远起作用。

run里面是我们真正要写的业务逻辑

FilterType过滤器的类型,zuul提供了四种过滤器的类型,这里可以写四个字符串。

从这四个里面挑一个来返回。根据你的实际情况。route是用来控制路由的,一般我们不会自己去写这个东西,因为zuul替我们做了这个事了。一般我们写前三个,pre就是在业务逻辑之前会执行过滤器里面的逻辑,也就是run方法里面的逻辑
post是在业务逻辑执行之后,执行run里面的逻辑
error是说在业务逻辑抛出异常之后,我们去会执行run里面的业务逻辑。

大部分情况下我们都是写pre。我们现在做安全用到的都是pre

filterOrder控制过滤器的执行顺序。我们之前也讲了 我们几种安全机制认证、审批、授权 限流是有顺序的,就是通过这个字段来控制。这里我们写一个1

开始写认证的逻辑

run方法里面是真正的逻辑。这里加上@Slf4j

在我们的订单服务里面的认证逻辑,他是直接发http请求到认证的服务器上。然后获取token它的信息。

同样的我们在filter里面也要做这个事
requestContext是用来获取请求和响应的。帮我们拿请求响应对象。

request就是拿到了当前的请求。

如果是发往认证服务器的 ,就直接返回了。因为这是去要做验证的。return null 就是走下一个filter了。

不是token请求的 ,就获取到请求头,Authorization。如果请求头是空 就返回null。在认证这个环节,不管是成功还是失败都要往下走。在这里不会拦截请求,不让往下走的。不管认证信息有没有,也不管认证信息对不对 ,都要往下走。

忽略大小写来判断 请求头是不是以bearer+空格 开头

tokenInfo

tokenInfo实际上就是调用check_token的返回

我们把他封装到tokenInfo这样的类里面

active:标明令牌是不是可用的
client_id:这个令牌是发给哪个客户端应用的
scope是一个数组
user_name:这个令牌是发给哪个用户的
aud:就是之前说的resourceId,就是这个令牌可以访问哪些资源服务器的id的数组。
exp:令牌的过期时间
authorities:用户对应的所有的权限

在认证服务器上发令牌的时候给所有的用户都设置了一个权限叫做ROLE_ADMIN

那么最终我们拿到令牌信息的时候,就是这个authorities

现在声明了一个叫做TokenInfo的对象,来封装check_token的响应

下面来创建getTokenInfo这个方法


首先是substring截取bearer后面的token

发送请求,在请求头上要带clientId、clientSecret,那么我要写一个HttpHeaders来带这些信息
因为我这个check_token的服务并不是一个rest服务,他不是发json请求的。所以我要告诉它 我发的是一个表单。

这个信息实际上在我的认证服务器上 没有注册。

我们之前只注册了 orderApp和orderService

现在把gateway也注册上。直接照抄上面一行就可以。这样我们就多了一个gateway的应用。这个引用申请的令牌也是只能访问order-server

最后再带上令牌的信息。注意这里只能用MultiValueMap,不能用hashMap等,会报错 跑不通。

然后把所有的信息组装成一个HttpEntity,HttpEntity的泛型就是param的MultiValueMap

注意这个HttpEntity是Springframework下的

把param和header都放进去。

发送请求

在上面声明restTemplate

结束

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

  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-8Zuul网关安全开发(一)

    安全相关的代码和业务逻辑相关的代码实际上是在一个应用里面的,在这个应用里面,我们需要去,这个应用本身的处理逻辑里面需要去处理令牌和用户信息之间的转换. 然后我们需要去知道认证服务器的地址,这些都是耦合 ...

  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. IDEA 相关设置汇总

    1.自动提示.代码补全 有时候希望使用自动补全,因为不偷懒的程序员不是好程序员.但是Idea的默认快捷键是 Ctrl + 空格. 对于安装中文输入法的普通人来说那就是杯具了,你懂的. 修改方法如下: ...

  2. Python程序格式规范

    Python是一种计算机编程语言.计算机编程语言和我们日常使用的自然语言有所不同,最大的区别就是,自然语言在不同的语境下有不同的理解,而计算机要根据编程语言执行任务,就必须保证编程语言写出的程序决不能 ...

  3. jquery页面多个倒计时效果

    <div class="timeBox" data-times="2019/06/30,23:59:59"> 距结束 <span class= ...

  4. POJ - 3252 - Round Numbers(数位DP)

    链接: https://vjudge.net/problem/POJ-3252 题意: The cows, as you know, have no fingers or thumbs and thu ...

  5. 面试官常问的20道Java题目(附答案)-来自Java1234

    1. 以下代码的输出结果是(A) int i =3; i = i++; System.out.println(i); A .3  B.4  C.5 a=b++是先将b值赋值给a后b再自增. 2. Ma ...

  6. bzoj 5299: [Cqoi2018]解锁屏幕 状压dp+二进制

    比较简单的状压 dp,令 $f[S][i]$ 表示已经经过的点集为 $S$,且最后一个访问的位置为 $i$ 的方案数. 然后随便转移一下就可以了,可以用 $lowbit$ 来优化一下枚举. code: ...

  7. easyui增删改查

    easyui的crud(dialog,datagrid.form讲解)1.datagrid布局2.dialog布局3.form布局4.通用的JsonBaseDao增删改方法5.dao层6.web层7. ...

  8. Uoj #35. 后缀排序(后缀数组)

    35. 后缀排序 统计 描述 提交 自定义测试 这是一道模板题. 读入一个长度为 nn 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在 ...

  9. UDP 区别于 TCP 的特点

    TCP 我们了解得多了,所以今天我们站在 UDP 的角度,探讨一下 UDP 区别于 TCP 的特点. 1. 面向无连接 UDP 比 TCP 简单得多,不需要“三次握手”来建立连接,直接把内容发送出去. ...

  10. 模板 - 数学 - 数论 - Miller-Rabin算法

    使用Fermat小定理(Fermat's little theorem)的原理进行测试,不满足 \(2^{n-1}\;\mod\;n\;=\;1\) 的n一定不是质数:如果满足的话则多半是质数,满足上 ...