配置Zuul代理下游的认证

配置Zuul代理下游的认证

您可以通过proxy.auth.*设置控制@EnableZuulProxy下游的授权行为。例:

application.yml
proxy:
  auth:
    routes:
      customers: oauth2
      stores: passthru
      recommendations: none

在此示例中,“客户”服务获取OAuth2令牌中继,“存储”服务获取传递(授权头只是通过下游),“建议”服务已删除其授权头。如果有令牌可用,则默认行为是执行令牌中继,否则为passthru。

有关详细信息,请参阅 ProxyAuthenticationProperties

Spring Cloud为Cloud Foundry

Cloudfoundry的Spring Cloud可以轻松地Cloud Foundry(平台即服务)中运行 Spring Cloud应用程序 Cloud Foundry有一个“服务”的概念,它是“绑定”到应用程序的中间件,本质上为其提供包含凭据的环境变量(例如,用于服务的位置和用户名)。

spring-cloud-cloudfoundry-web项目为Cloud Foundry中的webapps的一些增强功能提供基本支持:自动绑定到单点登录服务,并可选择启用粘性路由进行发现。

spring-cloud-cloudfoundry-discovery项目提供Spring Cloud Commons DiscoveryClient的实施,因此您可以@EnableDiscoveryClient并将您的凭据提供为spring.cloud.cloudfoundry.discovery.[email,password],然后直接或通过LoadBalancerClient使用DiscoveryClient /}(如果您没有连接到Pivotal Web Services,则也为*.url )。

第一次使用它时,发现客户端可能很慢,因为它必须从Cloud Foundry获取访问令牌。

发现

以下是Cloud Foundry发现的Spring Cloud应用程序:

app.groovy
@Grab('org.springframework.cloud:spring-cloud-cloudfoundry')
@RestController
@EnableDiscoveryClient
class Application {

  @Autowired
  DiscoveryClient client

  @RequestMapping('/')
  String home() {
    'Hello from ' + client.getLocalServiceInstance()
  }

}

如果您运行它没有任何服务绑定:

$ spring jar app.jar app.groovy
$ cf push -p app.jar

它将在主页中显示其应用程序名称。

DiscoveryClient可以根据身份验证的凭据列出空间中的所有应用程序,其中的空间默认为客户端运行的空间(如果有的话)。如果组织和空间都不配置,则它们将根据Cloud Foundry中的用户配置文件进行默认。

单点登录

注意
所有OAuth2 SSO和资源服务器功能在版本1.3中移动到Spring Boot。您可以在Spring Boot用户指南中找到文档

该项目提供从CloudFoundry服务凭据到Spring Boot功能的自动绑定。如果您有一个称为“sso”的CloudFoundry服务,例如,使用包含“client_id”,“client_secret”和“auth_domain”的凭据,它将自动绑定到您使用@EnableOAuth2Sso启用的Spring OAuth2客户端来自Spring Boot)。可以使用spring.oauth2.sso.serviceId对服务的名称进行参数化。

Spring Cloud Contract

文献作者:Adam Dudczak,MathiasDüsterhöft,Marcin Grzejszczak,Dennis Kieselhorst,JakubKubryński,Karol Lassak,Olga Maciaszek-Sharma,MariuszSmykuła,Dave Syer

Dalston.RELEASE

Spring Cloud Contract

您始终需要的是将新功能推向分布式系统中的新应用程序或服务的信心。该项目为Spring应用程序中的消费者驱动Contracts和服务架构提供支持,涵盖了一系列用于编写测试的选项,将其作为资产发布,声称生产者和消费者保留合同用于HTTP和消息的交互。

Spring Cloud Contract WireMock

模块让您有可能使用 WireMock使用嵌入在Spring Boot应用的“环境”服务器不同的服务器。查看 样品 了解更多详情。

重要
Spring Cloud发布列表BOM导入spring-cloud-contract-dependencies,这反过来又排除了WireMock所需的依赖关系。这可能导致一种情况,即使你不使用Spring Cloud Contract,那么你的依赖将会受到影响。

如果您有一个使用Tomcat作为嵌入式服务器的Spring Boot应用程序(默认为spring-boot-starter-web)),那么您可以简单地将spring-cloud-contract-wiremock添加到类路径中并添加@AutoConfigureWireMock,以便可以在测试中使用Wiremock。Wiremock作为存根服务器运行,您可以使用Java API或通过静态JSON声明来注册存根行为,作为测试的一部分。这是一个简单的例子:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@AutoConfigureWireMock(port = 0)
public class WiremockForDocsTests {
	// A service that calls out over HTTP
	@Autowired private Service service;

	// Using the WireMock APIs in the normal way:
	@Test
	public void contextLoads() throws Exception {
		// Stubbing WireMock
		stubFor(get(urlEqualTo("/resource"))
				.willReturn(aResponse().withHeader("Content-Type", "text/plain").withBody("Hello World!")));
		// We're asserting if WireMock responded properly
		assertThat(this.service.go()).isEqualTo("Hello World!");
	}

}

要使用@AutoConfigureWireMock(port=9999)(例如)启动不同端口上的存根服务器,并且对于随机端口使用值0.存根服务器端口将在测试应用程序上下文中绑定为“wiremock.server.port”。使用@AutoConfigureWireMock将一个类型为WiremockConfiguration的bean添加到测试应用程序上下文中,它将被缓存在具有相同上下文的方法和类之间,就像一般的Spring集成测试一样。

自动注册存根

如果您使用@AutoConfigureWireMock,则它将从文件系统或类路径注册WireMock JSON存根,默认情况下为file:src/test/resources/mappings您可以使用注释中的stubs属性自定义位置,这可以是资源模式(ant-style)或目录,在这种情况下,附加*/.json例:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureWireMock(stubs="classpath:/stubs")
public class WiremockImportApplicationTests {

	@Autowired
	private Service service;

	@Test
	public void contextLoads() throws Exception {
		assertThat(this.service.go()).isEqualTo("Hello World!");
	}

}
注意
实际上,WireMock总是从src/test/resources/mappings 加载映射以及 stubs属性的自定义位置。要更改此行为,您还必须如下所述指定文件根。

使用文件指定存根体

WireMock可以从类路径或文件系统上的文件读取响应体。在这种情况下,您将在JSON DSL中看到响应具有“bodyFileName”而不是(文字)“body”。默认情况下,相对于根目录src/test/resources/__files解析文件。要自定义此位置,您可以将@AutoConfigureWireMock注释中的files属性设置为父目录的位置(即,位置__files是子目录)。您可以使用Spring资源符号来引用file:…​classpath:…​位置(但不支持通用URL)。可以给出值列表,并且WireMock将在需要查找响应体时解析存在的第一个文件。

注意
当配置files根时,它会影响自动加载存根(它们来自称为“映射”的子目录中的根位置)。files的值对从stubs属性明确加载的存根没有影响。

替代方法:使用JUnit规则

对于更常规的WireMock体验,使用JUnit @Rules启动和停止服务器,只需使用WireMockSpring便利类来获取Options实例:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class WiremockForDocsClassRuleTests {

	// Start WireMock on some dynamic port
	// for some reason `dynamicPort()` is not working properly
	@ClassRule
	public static WireMockClassRule wiremock = new WireMockClassRule(
			WireMockSpring.options().dynamicPort());
	// A service that calls out over HTTP to localhost:${wiremock.port}
	@Autowired
	private Service service;

	// Using the WireMock APIs in the normal way:
	@Test
	public void contextLoads() throws Exception {
		// Stubbing WireMock
		wiremock.stubFor(get(urlEqualTo("/resource"))
				.willReturn(aResponse().withHeader("Content-Type", "text/plain").withBody("Hello World!")));
		// We're asserting if WireMock responded properly
		assertThat(this.service.go()).isEqualTo("Hello World!");
	}

}

使用@ClassRule表示服务器将在此类中的所有方法后关闭。

posted @ 2019-10-30 09:45  borter  阅读(480)  评论(0编辑  收藏  举报