微服务和Spring安全OAuth2

微服务和Spring安全OAuth2,spring,spring-security,oauth-2.0,Spring,Spring Security,Oauth 2.0,我已经在另一个项目中运行了OAuth2授权服务器。现在我需要用OAuth2保护几个简单的spring引导rest服务器。但我发现,在分离授权服务器和资源服务器方面,真正的限制是有限的 我还发现了几个问题,“只要它们共享相同的tokenStore数据源,它们就可以是不同的盒子”。这真的是真的吗?这怎么可能适用于微服务?每个rest服务都需要实现自己的OAuth授权服务器,这看起来真的很奇怪 那么,如何为引用远程oauth授权服务器(甚至可能不是用spring编写的)的spring引导rest端点设

我已经在另一个项目中运行了OAuth2授权服务器。现在我需要用OAuth2保护几个简单的spring引导rest服务器。但我发现,在分离授权服务器和资源服务器方面,真正的限制是有限的

我还发现了几个问题,“只要它们共享相同的tokenStore数据源,它们就可以是不同的盒子”。这真的是真的吗?这怎么可能适用于微服务?每个rest服务都需要实现自己的OAuth授权服务器,这看起来真的很奇怪

那么,如何为引用远程oauth授权服务器(甚至可能不是用spring编写的)的spring引导rest端点设置Oauth2.0安全性呢


有一种称为的东西似乎很有希望,但实际上根本没有记录在案。

如果资源服务器有某种方法来验证访问令牌是真实的(由授权服务器发布)并有某种方法对其进行解码,那么两者必须共享同一个数据库,这不是真的例如,OAuth2规范没有说明如何实现这一点

如果资源与授权服务器处于相同的过程中,则共享数据是一个简单的选择。否则,它需要某种方式转换令牌。如果令牌只是一个不透明的随机字节字符串,则显然它必须将其交换为真实信息。这就是
RemoteTokenServices
所做的。授权加密服务器公开一个
/check_令牌
端点,以允许对令牌进行解码

另一种方法是对令牌中的信息进行实际编码,并让授权服务器对其进行数字签名。然后,资源服务器可以解码并验证令牌本身,只要它理解该格式


我建议您看看Cloudfoundry,它提供了一个使用签名JWT令牌实现的现成授权服务器(它还公开了
/check\u令牌
端点)。和可能是一个很好的起点。

在配置auh服务器时:

在资源服务器的
ClientDetailsServiceConfigurer
中创建一个新的clientDetails。它将用于配置
RemoteTokenService

在资源服务器中配置Spring Security OAuth2:

创建一个类,该类使用
@EnableWebSecurity
@Configuration
进行注释,并扩展
websecurityconfigureadapter

@Configuration
@EnableWebSecurity
protected static class ResourceConfiguration extends WebSecurityConfigurerAdapter {
  // methods        
}
@Configuration
@EnableResourceServer
protected static class ResourceServerConfig extends ResourceServerConfigurerAdapter {
  // Mehotds
}
创建一个带有@Bean注释的方法,该方法将返回
TokenService
的实例,该实例将用于创建
AuthenticationManager

@Configuration
@EnableWebSecurity
protected static class ResourceConfiguration extends WebSecurityConfigurerAdapter {
  // methods        
}
@Configuration
@EnableResourceServer
protected static class ResourceServerConfig extends ResourceServerConfigurerAdapter {
  // Mehotds
}
在此方法中,创建一个
RemoteTokenService
实例,并设置clientId、client\u secret、checkTokenEndpointUrl和
DefaultAccessTokenConverterWithClientRoles
(此类是我们在OAuth2服务器中验证accessToken时获取客户端权限的实现。)

创建一个用
@EnableResourceServer
@Configuration
注释的类,并扩展
ResourceServerConfigurerAdapter

@Configuration
@EnableWebSecurity
protected static class ResourceConfiguration extends WebSecurityConfigurerAdapter {
  // methods        
}
@Configuration
@EnableResourceServer
protected static class ResourceServerConfig extends ResourceServerConfigurerAdapter {
  // Mehotds
}
重写从超类形成的配置方法以配置资源服务器。 用于配置资源服务器的不同配置程序

ResourceServerSecurityConfigure:配置资源\u id

HttpSecurity:这将配置安全过滤器,告诉它用户需要对受保护的URL(API)进行身份验证

.antMatcher(“/**”).authenticated()
此行将保护资源服务器的每个api url。
.sessionManagement().sessionCreationPolicy(sessionCreationPolicy.STATELESS)
将不会创建会话


PS::如果有任何问题,请告诉我。

可以找到
RemoteTokenService
的工作示例

有关
check_-token
api的更多详细信息,请参考
org.springframework.security.oauth2.provider.endpoint.CheckTokenEndpoint.java


在资源服务器端,
OAuth2AuthenticationProcessingFilter
通过调用调用
OAuth2AuthenticationManager.authenticate()
方法来验证OAuth2令牌,该方法调用
RemoteTokenServices.loadAuthentication()
验证来自身份验证服务器的令牌。

此设置是否在实际应用程序中经过测试?大多数设置看起来与我在项目中所做的相同。但是,我在无状态配置方面遇到了问题。在登录页和授权页之间丢失了一些内容。我相信OAuth2实现不支持无状态配置设置,因为RequestCache接口的唯一实现需要一个http会话来存储请求信息(HttpSessionRequestCache)。无状态策略会将此请求数据存储回响应中(可能存储在cookie中),因此任何其他副本都可以继续使用authorization
tokenServices.setCheckTokenEndpointUrl(“http://:/oauth/check_-token”);
是否仍有避免硬编码url的方法?我希望直接调用auth server的任何一个实例(从注册表服务器获取运行时url)或从redis检查令牌(在auth中使用redis令牌存储)是否有可能?