Spring boot 从Spring云网关到基础服务的凭据传播
我使用SpringCloudGateway作为UI网关。安全配置:Spring boot 从Spring云网关到基础服务的凭据传播,spring-boot,spring-security,spring-webflux,spring-cloud-gateway,Spring Boot,Spring Security,Spring Webflux,Spring Cloud Gateway,我使用SpringCloudGateway作为UI网关。安全配置: @Bean SecurityWebFilterChain springWebFilterChain(ServerHttpSecurity http) { return http.httpBasic().and() .formLogin().loginPage("/login") .and() .authorizeExchange().anyExcha
@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();
}
??是否有用于此目的的标准组件?我创建了一个过滤器,用于将用户名和用户角色添加到下游服务请求的标题中(Kotlin上的代码):
@组件
类AddCredentialsGlobalFilter:GlobalFilter{
private val usernameHeader=“登录用户”
private val rolesHeader=“已登录用户角色”
覆盖有趣的过滤器(exchange:ServerWebExchange,链:GatewayFilterChain)=exchange.getPrincipal()
.flatMap{p->
val request=exchange.request.mutate()
.header(usernameHeader,p.name)
.header(rolesHeader,(p作为身份验证).authorities?.joinToString(“;”):”)
.build()
chain.filter(exchange.mutate().request(request.build())
}
}
@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())
}
}