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

争对订单服务要做三个事,
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. 初学Django基础01 建立工程,目录结构,常用配置,上下文管理,模板渲染

    django是python的web重量级框架,发展已经有10年多了,对应下面版本 Django 版本 Python 版本 1.8 2.7, 3.2 , 3.3, 3.4, 3.5 1.9, 1.10 ...

  2. K8s中的多容器Pod和Pod内容器间通信

    容器(Container)常被用来解决比如微服务的单个问题,但在实际场景中,问题的解决往往需要多容器方案.本文会讨论将多个容器整合进单个Kubernetes Pod 中,以及Pod中的容器之间是如何通 ...

  3. Oracle数据库的分页

    Oracle的分页 ORACLE支持一个关键字ROWNUM,ROWNUM是一个伪列,该列不存在于任何一张表中,但是每张表都可以查询该列. 而该列在结果集的中值是结果集中每条记录的"行号&qu ...

  4. Ubuntu安装Apache 2.4.7常见问题解答

    环境:Apache 2.4.7 on Ubuntu 14.04 启动apache服务报错:Unknown Authz provider: ip 进入mod模块目录 cd /etc/apache2/mo ...

  5. 2019-2020-1 20199312 《Linux内核原理与分析》 第九周作业

    进程调度 1.中断:起到切出进程指令流的作用.中断处理程序是与进程无关的内核指令流.中断类型: 硬中断:可屏蔽中断和不可屏蔽中断.高电平说明有中断请求. 软中断/异常: 故障:出问题,但可以恢复到当前 ...

  6. Leonardo的笔记本LA 3641——置换的乘法

    题意 给出26个大写字母的置换 $B$,问是否存在一个置换 $A$,使得 $A^2=B$. 分析 首先,若A=BC,若B和C都能表示成两个相同循环的乘积,则A也能. 因为,不相交的循环的乘积满足交换律 ...

  7. 列举 Python2和Python3的区别?

    1.print 在python2中,print被视为一个语句而不是一个函数,python3中,print()被视为一个函数 2.整数的除法 在python2中,键入的任何不带小数的数字,将被视为整数的 ...

  8. jquery 如何控制音乐打开和关闭

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  9. JQuery购物车多物品数量的加减+总价计算

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. linux 文件解压缩

    转载 https://blog.csdn.net/qq_27803491/article/details/52785838 01-.tar格式 解包:[*******]$ tar xvf FileNa ...