Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器

认证服务器已经搭建好了。 可以通过认证服务器拿到令牌
下面改造订单服务,让它可以用这个令牌。
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
争对订单服务要做三个事,
1。让订单服务知道它自己是Oauth协议里面的资源服务器。,它知道这个事后,它才会在自己的应用前面去加一个过滤器,然后去校验这个令牌。
2.让它知道自己是什么资源服务器。让它声明一下,因为我们之前在认证服务器上,下面这个地方配置了发出去的令牌只能访问order-server这样一个资源服务器。所以我让它自己知道它是order-server
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
3.在订单服务上,配置怎么去验证这个令牌。去哪验,验的时候要带什么信息。这些都是在订单服务上要做的事情。

开始写代码

这里先注释掉。
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
创建server.resources包
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器

pom.xml内引入oauth2的引用。这样就会把Oauth协议相关的资源引进来。
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
有了依赖后,来写代码
继承这个适配器。
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
@EnableResourceServer告诉OrderService这个应用,它本身是作为oauth协议里面的资源服务器的角色存在的
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
ResourceServerConfigurerAdapter有两个配置方法,一个是配资源服务器的,本身的相关的配置
两外一个是HttpSecurity相关的配置。
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
@EbableResourceServer配置好了以后,表示它是一个资源服务器,下面只要配置资源服务器的id
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器

下面是认证中心的定义
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
覆盖掉配置方法configure方法,一定要配置在认证中心定义的一样。叫做order-server
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
那么我给orderAapp发出去的令牌现在只能访问order-server
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器

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

加上EnableResourceServer的注解后,所有发往order-api服务器的所有请求,它都会去你的头里面找Token。如果找不到token就不让你过。就是这样一个逻辑。
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
这个逻辑实际上这里来控制的,这是默认的一个配置。anyRequest就是任何请求,authenticated 是一定要身份认证。
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
所以就因为有了上面的配置,当我启动了以后,order-server里面提供所有的服务都会去验证token,没有token就不让过。有些情况下我们会去做权限控制。哪些请求需要验令牌,哪些请求不需要验令牌,当你需要做这样的控制的时候。就可以覆盖下面这个方法。重写里面的配置。
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
除了哈哈这个请求意外,其他的都需要验证令牌。
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器

验证令牌-配置文件

验证令牌怎么来验,我们写另外一个配置文件。
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器

Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器

写上这两个注解
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
从图里可以看到,我们验证令牌 需要发一个远程的请求到认证服务器。
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
需要声明一个新的Bean来做这个事。资源服务器的令牌服务。ResourceServerTokenServices它是一个接口,我们会有各种各样的实现。
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
我们用的这个实现叫做 RemoteTokenServices,从名字可以看出来,它是一个调用远程服务的TokenServices
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器

调用远程服务就要告诉他clientId和clientSecret。
setCheckTokenEndpointUrl:校验服务的地址。
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器

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

如果你想验证 跟用户相关的信息,应该用这个AuthenticationManager
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器

所以这里我要覆盖掉的方法是authenticationManager
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
把AuthenticationManagger暴露成一个Bean。加上@Bean注解。
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
这个时候就不能用系统默认的了 ,我们要自己写一个AuthenticationManager
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
那么做了这个配置以后。当我们的资源服务器,也就是order-api拦截到请求里面的token的时候。他就会调用这个方法来验证这个token
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
tokenServices里面配置的这个地址去验证token。获取token对应的用户信息。
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器

获取到用户信息之后,如何让我自己写的这个应用知道这个用户信息。比如创建订单的时候,带着一个令牌来访问创建订单的方法,那么在创建订单的方法里面,我如何知道这个令牌里的用户信息到底是哪个用户。
用@AuthenticationPrincipal 这样就拿到了用户名。这里目前写String,拿到用户名。
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
日志输出拿到的用户名。Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器

启动服务

Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
端口是9080
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器

调用创建订单的服务
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
因为已经加上资源服务的配置了,所以调用的时候 就是401错误。需要认证认证了。
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
之前拿令牌的方法 我们再去获取下
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
 反复申请的令牌,如果没过期,他会把这个令牌再给你。只不过 过期时间减少了。
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
在创建订单的服务上面 ,加上这个 authorization 值是复制过来的token令牌。
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
httpBasic也是用的 authorization的请求头,那么服务器如果知道你是HttpBasic还是OAuth2的令牌。我们在token前面加上 bearer 空格+token。
这样服务器就知道这是Oauth2的令牌,他就会用不同的逻辑去解这个令牌。
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器

Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器

控制台输出的用户名
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器

如果order-api的配置文件内把自己的resourceId改掉了,改成xxx-server
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
再次启动orderAPi
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
再去发送创建订单的请求
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
access_denied:没权限

Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器

这是一个无效的token,里面没有包含xxx-server的权限。
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
token在下发的时候可以访问order-server。上面的服务器是xxx-server所以是访问不了的Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器

获取到的用户名

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

Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器

调用创建订单的服务
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
创建订单的服务里面,写这样一个注解 就拿到了令牌对应的用户名是谁了。Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器

修改其他的

比如说修改ClientSecret改成 1234567 加了个7 这样就是错误的了。
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
重启orderAPI的服务
去验证令牌的时候,信息传错了。
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
看下控制台的错误信息。401就是身份认证失败。为什么认证失败 就是因为clientSceret传错了。
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器
现在确实是通过一个远程的服务验证令牌的
Spring cloud微服务安全实战-4-6搭建OAuth2资源服务器

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

结束

上一篇:事件驱动的简明讲解(python实现)


下一篇:Spring cloud微服务安全实战-4-5搭建OAuth2认证服务器