我有一个小的Spring Boot应用程序,使用Spring Cloud AWS(1.0.0.RELEASE)来访问SQS队列.它部署在具有实例配置文件集的EC2实例上.似乎AWS的一面正在发挥作用,因为我可以访问两个相关的元数据链接:iam/info并且iam/security-credentials/role-name,它们确实包含正确的信息.只是为了确定,我已经使用了aws cmdline实用程序(aws sqs list-queues)并且确实有效,所以我猜设置正常.但是,当应用程序启动时,它会读取application.properties(包含行cloud.aws.credentials.instanceProfile=true),然后在警告后丢弃:com.amazonaws.util.EC2MetadataUtils: Unable to retrieve the requested metadata最后抛出以下异常:
Caused by: com.amazonaws.AmazonServiceException: The security token included in the request is invalid. (Service: AmazonSQS; Status Code: 403; Error Code: InvalidClientTokenId; Request ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:1071)
at com.amazonaws.http.AmazonHttpClient.executeOneRequest(AmazonHttpClient.java:719)
at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:454)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:294)
at com.amazonaws.services.sqs.AmazonSQSClient.invoke(AmazonSQSClient.java:2291)
at com.amazonaws.services.sqs.AmazonSQSClient.getQueueUrl(AmazonSQSClient.java:516)
at com.amazonaws.services.sqs.buffered.AmazonSQSBufferedAsyncClient.getQueueUrl(AmazonSQSBufferedAsyncClient.java:278)
at org.springframework.cloud.aws.messaging.support.destination.DynamicQueueUrlDestinationResolver.resolveDestination(DynamicQueueUrlDestinationResolver.java:78)
at org.springframework.cloud.aws.messaging.support.destination.DynamicQueueUrlDestinationResolver.resolveDestination(DynamicQueueUrlDestinationResolver.java:37)
at org.springframework.messaging.core.CachingDestinationResolverProxy.resolveDestination(CachingDestinationResolverProxy.java:88)
at org.springframework.cloud.aws.messaging.listener.AbstractMessageListenerContainer.start(AbstractMessageListenerContainer.java:295)
at org.springframework.cloud.aws.messaging.listener.SimpleMessageListenerContainer.start(SimpleMessageListenerContainer.java:38)
at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:173)
... 17 common frames omitted
Run Code Online (Sandbox Code Playgroud)
...这意味着由于某种原因,Spring …
非常感谢您提前阅读这个问题.
我在用:
spring-security-oauth2:2.0.7.RELEASEspring-cloud-security:1.0.1.RELEASEspring-session:1.0.1.RELEASE并且在单一登录(),反向代理()网关中spring-security-oauth2 OAuth2ClientContext使用spring-session(via @EnableRedisHttpSession)时,会有一个关于Redis数据存储区中持久性的问题.@EnableOAuth2Sso@EnableZuulProxy
在我看来,创建的SessionScopedJdkDynamicAopProxied 未正确保存在Redis数据存储区中.DefaultOAuth2ClientContextorg.springframework.cloud.security.oauth2.client.OAuth2ClientAutoConfiguration
@Configuration
@ConditionalOnBean(OAuth2SsoConfiguration.class)
@ConditionalOnWebApplication
protected abstract static class SessionScopedConfiguration extends BaseConfiguration {
@Bean
@Scope(value = "session", proxyMode = ScopedProxyMode.INTERFACES)
public OAuth2ClientContext oauth2ClientContext() {
return new DefaultOAuth2ClientContext(accessTokenRequest);
}
}
Run Code Online (Sandbox Code Playgroud)
调试oauth2ClientContextwithout 的创建@EnableRedisHttpSession表明(如预期的那样)bean将在每个客户端会话中实例化一次并存储在HttpSession.然后,这个实例将被重用存储获取的OAuth2 bearerToken除了存储的OAuth2细节accessToken在春天SecurityContext的org.springframework.security.core.Authentication.
但是,一旦使用@EnableRedisHttpSession,oauth2ClientContextbean将首先在会话创建时创建,但也将在稍后创建(同时仍使用相同的客户端会话).调试Redis客户端会话内容可确认oauth2ClientContext会话创建未正确保留:
在我们检索OAuth2之前bearerToken(NO SpringContext,NO scopedTarget.oauth2ClientContext):
~$ …Run Code Online (Sandbox Code Playgroud) spring-security spring-security-oauth2 spring-session spring-cloud
这是我的设置:
第一个服务(FlightIntegrationApplication),它使用FeignClients API和Eureka调用第二个服务(BaggageServiceApplication).
github项目:https://github.com/IdanFridman/BootNetflixExample
第一次服务:
@SpringBootApplication
@EnableCircuitBreaker
@EnableDiscoveryClient
@ComponentScan("com.bootnetflix")
public class FlightIntegrationApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(FlightIntegrationApplication.class).run(args);
}
}
Run Code Online (Sandbox Code Playgroud)
在其中一个控制器中:
@RequestMapping("/flights/baggage/list/{id}")
public String getBaggageListByFlightId(@PathVariable("id") String id) {
return flightIntegrationService.getBaggageListById(id);
}
Run Code Online (Sandbox Code Playgroud)
FlightIntegrationService:
public String getBaggageListById(String id) {
URI uri = registryService.getServiceUrl("baggage-service", "http://localhost:8081/baggage-service");
String url = uri.toString() + "/baggage/list/" + id;
LOG.info("GetBaggageList from URL: {}", url);
ResponseEntity<String> resultStr = restTemplate.getForEntity(url, String.class);
LOG.info("GetProduct http-status: {}", resultStr.getStatusCode());
LOG.info("GetProduct body: {}", resultStr.getBody());
return resultStr.getBody();
}
Run Code Online (Sandbox Code Playgroud)
RegistryService:
@Named
public …Run Code Online (Sandbox Code Playgroud) spring spring-boot spring-cloud netflix-feign netflix-eureka
我正在尝试设置一个Spring Cloud Config服务器,该服务器使用ssh私钥的自定义位置.我需要为密钥指定自定义位置的原因是因为运行应用程序的用户没有主目录..所以我没有办法使用~/.ssh我的密钥的默认目录.我知道可以选择创建只读帐户并在配置中提供用户/密码,但ssh方式接缝更干净.
有没有办法设置这个?
我想在我的Spring Boot项目中使用Zuul.
application.properties
server.context-path=/${spring.application.name}
zuul.routes.engine.path=/api/engine/**
zuul.routes.engine.url=${engine.url}
Run Code Online (Sandbox Code Playgroud)
GET请求正在运行; 但是,Zuul没有转发我的POST请求.我没有看到任何调试输出为无论是GET还是POST在这里列出:如何使用.
如何DEBUG为Zuul 启用日志记录模式?
使用spring-mvc注释,如何定义可以POST form-url-encoded的@FeignClient?
我试过WebClient用LoadBalancerExchangeFilterFunction:
WebClient 配置:
@Bean
public WebClient myWebClient(final LoadBalancerExchangeFilterFunction lbFunction) {
return WebClient.builder()
.filter(lbFunction)
.defaultHeader(ACCEPT, APPLICATION_JSON_VALUE)
.defaultHeader(CONTENT_ENCODING, APPLICATION_JSON_VALUE)
.build();
}
Run Code Online (Sandbox Code Playgroud)
然后我注意到对底层服务的调用没有正确地进行负载平衡 - 每个实例上的RPS存在恒定的差异.
然后我试着回去RestTemplate.它工作正常.
配置RestTemplate:
private static final int CONNECT_TIMEOUT_MILLIS = 18 * DateTimeConstants.MILLIS_PER_SECOND;
private static final int READ_TIMEOUT_MILLIS = 18 * DateTimeConstants.MILLIS_PER_SECOND;
@LoadBalanced
@Bean
public RestTemplate restTemplateSearch(final RestTemplateBuilder restTemplateBuilder) {
return restTemplateBuilder
.errorHandler(errorHandlerSearch())
.requestFactory(this::bufferedClientHttpRequestFactory)
.build();
}
private ClientHttpRequestFactory bufferedClientHttpRequestFactory() {
final SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setConnectTimeout(CONNECT_TIMEOUT_MILLIS);
requestFactory.setReadTimeout(READ_TIMEOUT_MILLIS);
return new BufferingClientHttpRequestFactory(requestFactory);
} …Run Code Online (Sandbox Code Playgroud) load-balancing resttemplate spring-cloud spring-cloud-netflix spring-webflux
我在Spring Cloud和CSRF保护方面遇到了一些问题.我使用Spring Cloud Security,OAuth2等保护了我的应用程序(网关和注册服务).
我授予每个人(permitAll)访问/ signup的权限,这是网关路由到实际注册服务的地方.我还授予了注册服务器本身的所有人访问权限.这按预期工作.
令我头疼的是CSRF保护.网关和注册服务都自己创建CSRF令牌.来自网关的令牌将被发送到客户端,并且来自注册服务的令牌丢失(在网关的某处).
如果我向注册服务发布了一些内容,CSRF保护就会启动并表示令牌为空,或者实际值与预期值不匹配,如果我尝试重用HTTP中可用的网关值头.
我已经让它在注册服务上禁用CSRF,但它似乎不是正确的解决方案,因为它只适用于有人从客户端发回令牌,如Angular SPA.当我尝试从浏览器提交表单(在注册服务上呈现)时,由于缺少_csrf参数而失败.如果我在注册服务上激活CSRF并将_csrf参数添加到表单中,网关的CSRF保护就会启动并说实际令牌与预期令牌不匹配,这是绝对正确的,因为实际令牌是一个来自注册服务,而预期的令牌来自网关.
我可以在网关上禁用CSRF,但这将导致我必须在REST客户端或SPA使用的每个服务上配置CSRF内容.
我在HttpSecurity.csrf()配置中尝试了ignoreAntMatchers(),我可以在其中排除特定路径,但这对我也没有帮助.期望值是完全不同的.似乎为POST请求创建了一个新会话.
那么有没有机会我可以在网关上使用CSRF,并立即使用表单提交和Zuul注册服务?
csrf spring-security spring-boot spring-cloud spring-cloud-security
我使用的是 spring boot 版本 - 2.0.6.RELEASE 和 spring cloud 版本 - Finchley.SR2
我已经创建了我的自定义网关过滤器来修改请求正文。
但是在使用 Flux 将请求正文转换为字符串时,我得到了一个空字符串。我需要一种方法来获取与我的请求正文对应的字符串。
@Override
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = (ServerHttpRequest) exchange.getRequest();
String s = resolveBodyFromRequest(request);
/* s comes out to be "" */
return chain.filter(newExchange);
}
private String resolveBodyFromRequest(ServerHttpRequest serverHttpRequest){
//Get the request body
Flux<DataBuffer> body = serverHttpRequest.getBody();
StringBuilder sb = new StringBuilder();
body.subscribe(buffer -> {
byte[] bytes = new byte[buffer.readableByteCount()];
buffer.read(bytes);
DataBufferUtils.release(buffer);
String bodyString = new String(bytes, StandardCharsets.UTF_8);
sb.append(bodyString);
});
return …Run Code Online (Sandbox Code Playgroud) 只需添加 spring-cloud-starter-zipkin 也能够生成 spanId 和 TraceId 那么 Sleuth 需要什么?spring-cloud-starter-zipkin 实际上是自己拉 io.zipkin.brave 而不是 Sleuth。
spring-cloud ×10
spring-boot ×5
spring ×3
java ×2
csrf ×1
feign ×1
netflix-zuul ×1
resttemplate ×1
spring-mvc ×1
zipkin ×1