从 Spring Cloud Gateway 到底层服务的凭证传播
Posted
技术标签:
【中文标题】从 Spring Cloud Gateway 到底层服务的凭证传播【英文标题】:Credentials propagation from Spring Cloud Gateway to underlying service 【发布时间】:2018-08-30 19:36:14 【问题描述】:我使用 Spring Cloud Gateway 作为 UI 网关。安全配置:
@Bean
SecurityWebFilterChain springWebFilterChain(ServerHttpSecurity http)
return http.httpBasic().and()
.formLogin().loginPage("/login")
.and()
.authorizeExchange().anyExchange().permitAll()
.and()
.build();
如何将当前用户凭据(用户名和角色)传播到底层服务?我是否需要在路由配置中添加一些自定义过滤器:
@Bean
RouteLocator routeLocator(RouteLocatorBuilder builder)
return builder.routes()
.route("some-ui", r -> r.path("/some-ui-context-path/**")
.uri("lb://some-ui"))
.build();
?是否有用于此目的的标准组件?
【问题讨论】:
【参考方案1】:我创建了过滤器,用于将用户名和用户角色添加到下游服务请求的标头(Kotlin 上的代码):
@Component
class AddCredentialsGlobalFilter : GlobalFilter
private val usernameHeader = "logged-in-user"
private val rolesHeader = "logged-in-user-roles"
override fun filter(exchange: ServerWebExchange, chain: GatewayFilterChain) = exchange.getPrincipal<Principal>()
.flatMap p ->
val request = exchange.request.mutate()
.header(usernameHeader, p.name)
.header(rolesHeader, (p as Authentication).authorities?.joinToString(";") ?: "")
.build()
chain.filter(exchange.mutate().request(request).build())
【讨论】:
以上是关于从 Spring Cloud Gateway 到底层服务的凭证传播的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Spring Cloud Gateway 的 GlobalFilter 中的 SecurityContext 获取 BearerTokenAuthentication
一篇搞懂Spring Cloud Gateway(从入门到放弃)
Spring Cloud Gateway 和 TokenRelay 过滤器
聊聊spring cloud gateway的NettyConfiguration