application.yml для приложения Spring Cloud Gateway.
Используются два фильтра: первая проверка заголовка авторизации в запросе, вторая проверка с ролями, указанными в этом yaml.
spring:
application:
name: MultipleFilters
cloud:
gateway:
routes:
- id: meterset
uri: http://localhost:9000/meterset
predicates:
- Path=/meterset
filters:
- name: AuthenticationFilter
- name: RoleFilter
args:
role1: editor
role2: viewer
Custom Gateway Filter для проверки того, можно ли разрешить запрос на основе ролей, указанных в yaml.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.GatewayFilterFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@Component
public class RoleFilter implements GatewayFilterFactory<RoleFilter.Config> {
private static final String VALUE = "value";
@Override
public GatewayFilter apply(Config config) {
// exchange holds request, response and other server related Properties
return (exchange, chain) -> {
// get the request
ServerHttpRequest request = exchange.getRequest();
return chain.filter(exchange);
};
}
// Edit the response on error
private Mono<Void> onError(ServerWebExchange exchange, String err, HttpStatus httpStatus) {
ServerHttpResponse response = exchange.getResponse();
response.setStatusCode(httpStatus);
return response.setComplete();
}
@Override
public List<String> shortcutFieldOrder() {
return Collections.singletonList(VALUE);
}
@Override
public Config newConfig() {
return new Config();
}
public static class Config {
private List<String> value;
private String role1;
private String role2;
public List<String> getValue() {
return value;
}
public void setValue(List<String> value) {
this.value = value;
}
public String getRole1() {
return role1;
}
public void setRole1(String role1) {
this.role1 = role1;
}
public String getRole2() {
return role2;
}
public void setRole2(String role2) {
this.role2 = role2;
}
}
}
Мне удалось передать различные аргументы в виде пар ключ-значение. Есть ли способукажите аргументы в виде значений, разделенных запятыми, например RoleFilter = viewer, редактор