认证服务器已经搭建好了。 可以通过认证服务器拿到令牌
下面改造订单服务,让它可以用这个令牌。

争对订单服务要做三个事,
1。让订单服务知道它自己是Oauth协议里面的资源服务器。,它知道这个事后,它才会在自己的应用前面去加一个过滤器,然后去校验这个令牌。
2.让它知道自己是什么资源服务器。让它声明一下,因为我们之前在认证服务器上,下面这个地方配置了发出去的令牌只能访问order-server这样一个资源服务器。所以我让它自己知道它是order-server

3.在订单服务上,配置怎么去验证这个令牌。去哪验,验的时候要带什么信息。这些都是在订单服务上要做的事情。

开始写代码

这里先注释掉。

创建server.resources包

pom.xml内引入oauth2的引用。这样就会把Oauth协议相关的资源引进来。

有了依赖后,来写代码
继承这个适配器。


@EnableResourceServer告诉OrderService这个应用,它本身是作为oauth协议里面的资源服务器的角色存在的

ResourceServerConfigurerAdapter有两个配置方法,一个是配资源服务器的,本身的相关的配置
两外一个是HttpSecurity相关的配置。

@EbableResourceServer配置好了以后,表示它是一个资源服务器,下面只要配置资源服务器的id

下面是认证中心的定义

覆盖掉配置方法configure方法,一定要配置在认证中心定义的一样。叫做order-server

那么我给orderAapp发出去的令牌现在只能访问order-server

另一个方法实际上是在控制器权限

加上EnableResourceServer的注解后,所有发往order-api服务器的所有请求,它都会去你的头里面找Token。如果找不到token就不让你过。就是这样一个逻辑。

这个逻辑实际上这里来控制的,这是默认的一个配置。anyRequest就是任何请求,authenticated 是一定要身份认证。

所以就因为有了上面的配置,当我启动了以后,order-server里面提供所有的服务都会去验证token,没有token就不让过。有些情况下我们会去做权限控制。哪些请求需要验令牌,哪些请求不需要验令牌,当你需要做这样的控制的时候。就可以覆盖下面这个方法。重写里面的配置。

除了哈哈这个请求意外,其他的都需要验证令牌。

验证令牌-配置文件

验证令牌怎么来验,我们写另外一个配置文件。

写上这两个注解

从图里可以看到,我们验证令牌 需要发一个远程的请求到认证服务器。

需要声明一个新的Bean来做这个事。资源服务器的令牌服务。ResourceServerTokenServices它是一个接口,我们会有各种各样的实现。

我们用的这个实现叫做 RemoteTokenServices,从名字可以看出来,它是一个调用远程服务的TokenServices

调用远程服务就要告诉他clientId和clientSecret。
setCheckTokenEndpointUrl:校验服务的地址。

还要让它知道调用这个服务去验token,所谓的验token,就是拿这个token去获取用户信息,问一下认证服务器,这个令牌对应的用户信息是什么样的

如果你想验证 跟用户相关的信息,应该用这个AuthenticationManager

所以这里我要覆盖掉的方法是authenticationManager

把AuthenticationManagger暴露成一个Bean。加上@Bean注解。

这个时候就不能用系统默认的了 ,我们要自己写一个AuthenticationManager

那么做了这个配置以后。当我们的资源服务器,也就是order-api拦截到请求里面的token的时候。他就会调用这个方法来验证这个token

tokenServices里面配置的这个地址去验证token。获取token对应的用户信息。

获取到用户信息之后,如何让我自己写的这个应用知道这个用户信息。比如创建订单的时候,带着一个令牌来访问创建订单的方法,那么在创建订单的方法里面,我如何知道这个令牌里的用户信息到底是哪个用户。
用@AuthenticationPrincipal 这样就拿到了用户名。这里目前写String,拿到用户名。

日志输出拿到的用户名。

启动服务


端口是9080

调用创建订单的服务

因为已经加上资源服务的配置了,所以调用的时候 就是401错误。需要认证认证了。

之前拿令牌的方法 我们再去获取下

 反复申请的令牌,如果没过期,他会把这个令牌再给你。只不过 过期时间减少了。

在创建订单的服务上面 ,加上这个 authorization 值是复制过来的token令牌。

httpBasic也是用的 authorization的请求头,那么服务器如果知道你是HttpBasic还是OAuth2的令牌。我们在token前面加上 bearer 空格+token。
这样服务器就知道这是Oauth2的令牌,他就会用不同的逻辑去解这个令牌。

控制台输出的用户名

如果order-api的配置文件内把自己的resourceId改掉了,改成xxx-server

再次启动orderAPi

再去发送创建订单的请求

access_denied:没权限

这是一个无效的token,里面没有包含xxx-server的权限。

token在下发的时候可以访问order-server。上面的服务器是xxx-server所以是访问不了的

获取到的用户名

就是我们在获取token的时候,传过去的用户名。

调用创建订单的服务

创建订单的服务里面,写这样一个注解 就拿到了令牌对应的用户名是谁了。

修改其他的

比如说修改ClientSecret改成 1234567 加了个7 这样就是错误的了。

重启orderAPI的服务
去验证令牌的时候,信息传错了。


看下控制台的错误信息。401就是身份认证失败。为什么认证失败 就是因为clientSceret传错了。

现在确实是通过一个远程的服务验证令牌的

资源服务器相关的内容,暂时就讲到这里。

结束

Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器的更多相关文章

  1. Spring cloud微服务安全实战-7-3prometheus环境搭建

    Prmetheus 主要用来做来Metrics的监控和报警,这张图是官方的架构图. 这是他的核心 它的作用是根据我们的配置去完成数据的采集.服务的发现,以及数据的存储. 这是服务的发现,通过Servi ...

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

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

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

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

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

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

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

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

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

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

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

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

  8. Spring Cloud微服务安全实战_4-4_OAuth2协议与微服务安全

    接上篇文章,在这个流程中,PostMan可以代表客户端应用,订单服务是资源服务器,唯一缺少的是 认证服务器 ,下面来搭建认证服务器 项目结构: Pom.xml : DependencyManager ...

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

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

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

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

随机推荐

  1. python get/post接口使用

    背景: 使用python调用get post接口,入参.出参都需要转换,在使用时经常会忘记其中的一步,本文用来记录,后面再使用时直接参考使用 代码如下 post: headers = {'Conten ...

  2. CF553E Kyoya and Train

    Kyoya and Train 一个有\(n\)个节点\(m\)条边的有向图,每条边连接了\(a_i\)和\(b_i\),花费为\(c_i\). 每次经过某一条边就要花费该边的\(c_i\). 第\( ...

  3. machine learning (1)

    Machine learning (1)   机器学习的两种定义 the field of study that gives computers the ability to learn withou ...

  4. usa物价统计

    国内                   usa                                           折合人民币                  战损 nike鞋  ...

  5. 阿里druid数据源配置及数据库密码加密

    注意: 1.阿里默认只对用户密码解密 2.druid 1.0.16版本及以上的解密时需要同时配置publicKey 一.生成密文密码 1 前提:已经配置了jdk环境 1.生成密文密码需要准备druid ...

  6. Linux下安装Phalcon系统环境安装Phalcon 及 安装Phalcon Developer Tools

    一.安装Phalcon Phalcon 需要用的的PHP扩展函数有如下: curl gettext gd2 (to use the Phalcon\Image\Adapter\Gd class) li ...

  7. cf 911F 树的直径+贪心

    $des$ 给定一棵 n 个节点的树,你可以进行 n ? 1 次操作,每次操作步骤如下:选择 u,v 两个度数为 1 的节点.将 u,v 之间的距离加到 ans 上.将 u 从树上删除.求一个操作序列 ...

  8. Java中的位运算及简单的算法应用介绍

    众所周知,计算机底层是二进制.而java作为一门计算机编程语言,也对二进制的位运算提供了完整的支持. 在java中,int是32位的,也就是说可以用来实现32位的位运算.方便起见,我们一般用16进制对 ...

  9. Mujin Programming Challenge 2017题解

    传送门 \(A\) 似乎并不难啊然而还是没想出来-- 首先我们发现对于一个数\(k\),它能第一个走到当且仅当对于每一个\(i<k\)满足\(x_i\geq 2i-1\),这样我们就可以把所有的 ...

  10. Python逆向(五)—— Python字节码解读

    一.前言 前些章节我们对python编译.反汇编的原理及相关模块已经做了解读.读者应该初步掌握了通过反汇编获取python程序可读字节码的能力.python逆向或者反汇编的目的就是在没有源码的基础上, ...