Spring Security实现OAuth2.0——资源服务
在上一篇文章中,我们已经实现了授权服务器,拿到访问token已经不是问题了。本文主要讲述如何搭建一个资源服务器,根据第三方客户端访问请求和token来实现资源的权限控制。
资源服务器的核心配置类就是需要继承 ResourceServerConfigurerAdapter ,并重写其中的资源配置方法和安全鉴权方法。
token校验有两种方式:
我们该案例中资源服务器和授权服务器是不同的机器,大多数实际业务场景中也是不同的,所以我们以 RemoteTokenServices 为例进行演示,这里放到和资源服务器配置类一块:
资源服务器也是一个独立的应用,所以也需要增加安全访问的配置,这个在先前讲Spring Security的时候已经详细介绍过了。
最后,增加我们的访问资源即可,这里就是Controller。
此时,我们就完成了资源服务器的所有内容。
我们以 客户端模式 启动上一节的授权服务器后,通过HTTP工具(我这里使用IDEA的插件RestClient)来进行如下的测试:
首先访问如下请求以获取访问token:
得到的内容如下:
此时我们先不使用资源服务器,我们使用如下的请求来模拟资源服务器的验证token,以此来判断授权服务器是否能正常工作:
得到的返回内容是:
可以看到,允许访问的资源ID是 user 、访问的资源域是 all ,拥有的权限是 user:query ,供client_id为 iSchool 的第三方应用访问,这和我们前面配置授权服务器时的内容一致,因此授权服务是正常的。
然后,我们就启动资源服务器,现在来请求资源服务器的资源,并带上我们从授权服务器那里得到的token:
得到的返回结果为:
但是,如果我们访问另外一个接口:
得到的结果就是:
很明显,当资源服务请求授权服务的时候,授权服务告诉资源服务,当前这个访问token只有 user:query 权限,所以需要其它权限才能访问的资源就被禁止。
如果我们的资源服务器域名称不是 all ,而是改成了 user ,那么访问资源就会报错如下信息:
在实际的使用场景中,一个访问token并不仅仅限制只能访问拥有权限范围内的接口,还会限制只能访问某个客户的信息,因此我们还需要在授权中增加用户的身份信息。待研究。