前文
【Spring Security OAuth2】客户端授权模式(client credentials)~资源服务配置
我们设定 授权服务 和 资源服务 是两个单独的应用,在 资源服务 中使用
RemoteTokenServices
对
Token
进行校验。
从图中可以看出,
ResourceServerTokenServices
接口有两个实现类(
DefaultTokenServices
、
RemoteTokenServices
),而
DefaultTokenServices
类同时实现了
AuthorizationServerTokenServices
、
ResourceServerTokenServices
接口。
当 授权服务 和 资源服务 是两个单独的应用时,资源服务端使用
RemoteTokenServices
校验
Token
,而授权服务端使用
DefaultTokenServices
校验
Token
当 授权服务 和 资源服务 是同一个应用时,使用
DefaultTokenServices
校验
Token
ResourceServerTokenServices
接口定义了两个方法,一个是根据指定的
Token
获取认证信息,另一个是根据指定的
Token
获取完整的
Token
详情。
在请求头中设置
Authorization
参数
将客户端ID和客户端密钥以
:
间隔进行拼接,然后将拼接后的字符串使用
BASE64
编码与
Basic
拼接,便可生成
Authorization
参数的值
设置完参数后像授权服务发送
Token
校验请求
通过
AccessTokenConverter
接口的
extractAuthentication
方法从请求结果中提取认证信息
AccessTokenConverter
接口有多个实现类,由于我们在配置资源服务时并未指定
AccessTokenConverter
接口的实现类,故系统使用默认的实现类
DefaultAccessTokenConverter
如果资源服务设置了
resourceId
且客户端详情中也设置了可访问的资源ID,则校验客户端详情中设置的可访问资源ID集合中是否包含当前资源ID
若资源服务端设置了
clientDetailsService
则校验认证信息中可访问的范围是否包含客户端可访问范围
在
【Spring Security OAuth2】客户端授权模式(client credentials)~资源服务配置
一文中,我们曾在application.properties文件中设置两个属性
security.oauth2.client.clientid=app
security.oauth2.client.clientSecret=app
这两个值与 我们获取
Token
时设置的值无关
调整application.properties文件中这两个属性为
security.oauth2.client.clientid=secret
security.oauth2.client.clientSecret=secret
当我们使用
app
获取访问令牌并访问资源
resourceA
时,可以正常访问
当我们使用
secret
获取访问令牌并访问资源
resourceA
时,无法访问
但属性文件中设置的那两个属性,必须在
oauth_client_details
表中存在