繁体   English   中英

微服务和Spring Security OAuth2

[英]Microservices and Spring Security OAuth2

我已经在另一个项目中运行了OAuth2授权服务器。 现在我需要使用OAuth2来保护几个简单的spring-boot rest-servers。 但是我发现Spring文档在分离授权和资源服务器时确实非常有限。

我还发现了几个问题, 答案是“只要它们共享相同的tokenStore数据源,它们就可以是不同的盒子”。 这真的可以吗? 这怎么可能对微服务有用? 每个休息服务都需要实现它自己的OAuth授权服务器,这似乎是一件非常奇怪的事情。

那么如何为引用远程oauth授权服务器的spring-boot rest-endpoints设置Oauth2.0安全性(可能甚至不用Spring编写)?

这个名为RemoteTokenServices的东西似乎很有希望,但根本没有记录。

配置你的auh服务器::

ClientDetailsServiceConfigurer为资源服务器创建新的clientDetails。 这将用于配置RemoteTokenService

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

创建一个使用@EnableWebSecurity@Configuration @EnableWebSecurity @Configuration注释的类,并扩展WebSecurityConfigurerAdapter

@Configuration
@EnableWebSecurity
protected static class ResourceConfiguration extends WebSecurityConfigurerAdapter {
  // methods        
}

使用@Bean注释创建一个方法,该方法将返回TokenService实例,该实例将用于创建AuthenticationManager

在此方法中创建RemoteTokenService的实例并设置clientId,client_secret,checkTokenEndpointUrl和DefaultAccessTokenConverterWithClientRoles (此类是我们在OAuth2服务器中验证accessToken时获取client_authority的实现。)

@Bean
public ResourceServerTokenServices tokenService() {
    RemoteTokenServices tokenServices = new RemoteTokenServices();
    tokenServices.setClientId("resource_id");
    tokenServices.setClientSecret("resource_secret");
    tokenServices.setCheckTokenEndpointUrl("http://<server-url>: <port>/oauth/check_token");
    return tokenServices;
}

覆盖authenticationManagerBean()方法并使用@Bean注释它,并返回注入了OAuth2AuthenticationManagerTokenService实例。

@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
    OAuth2AuthenticationManager authenticationManager = new OAuth2AuthenticationManager();
    authenticationManager.setTokenServices(tokenService());
    return authenticationManager;
}

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

@Configuration
@EnableResourceServer
protected static class ResourceServerConfig extends ResourceServerConfigurerAdapter {
  // Mehotds
}

覆盖配置方法构成超类以配置资源服务器。 不同的配置器配置资源服务器。

ResourceServerSecurityConfigurer :配置Resource_id。

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

@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
    resources.resourceId("resource_id");
}

@Override
public void configure(HttpSecurity http) throws Exception {
    // @formatter:off
    http
     .authorizeRequests()
     .antMatchers("/**").authenticated()
     .and()
     .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    // @formatter:on
}

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

PS ::如果有什么不对的话请告诉我。

如果资源服务器有某种方式来验证访问令牌是真实的(由授权服务器发布)以及解码它的某种方式(它可能需要知道什么,那么两者都必须共享同一个数据库并不是真的。例如,它授予的范围。 OAuth2规范没有说明如何实现这一目标。

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

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

我建议您查看Cloudfoundry UAA ,它提供了一个开箱即用的授权服务器,它使用签名的JWT令牌实现(它还公开了/check_token端点)。 令牌概述API文档可能是一个很好的起点。

可以在此处找到RemoteTokenService的工作示例。

有关check_token api的更多详细信息,请参阅org.springframework.security.oauth2.provider.endpoint.CheckTokenEndpoint.java

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM