网关全局过滤器在Kotlin中的实现到Java实现



我有一个场景,我有一些微服务、云网关和eureka服务器。所有微服务和云网关都在尤里卡服务器上注册。云网关将保护所有下游服务。当任何用户想要首先访问该服务时,它将填写用户名和密码,以便在云网关上进行身份验证。如果用户是可信的,那么它将通过application.properties文件中已经设置的网关路由访问服务,但我希望用户何时可信并访问服务,然后我也可以在云网关后面的下游服务或微服务中获得用户可信凭据。换句话说,我想获得在下游服务的网关上设置的原则值。所以,在搜索了很多天后,我得到了一个全局过滤器实现链接,但这个过滤器代码在Kotlin,我对Kotlin不熟悉,所以无法理解这一点。我想用Java实现这一点。基本上,这个过滤器用于将用户名和用户角色添加到下游服务请求的头部。如何将此筛选器转换为java。

这是工作流程

以下是云网关配置

@Configuration
@EnableWebFluxSecurity
public class GatewaySecurityConfig{
@Bean
public MapReactiveUserDetailsService userDetailsService() {
UserDetails user = User.builder()
.username("user")
.password(passwordEncoder().encode("password"))
.roles("USER")
.build();
UserDetails admin = User.builder()
.username("admin")
.password(passwordEncoder().encode("password"))
.roles("USER","ADMIN")
.build();
return new MapReactiveUserDetailsService(user, admin);
}

@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
http
.authorizeExchange()
.anyExchange().authenticated()
.and()
.httpBasic(withDefaults())
.formLogin();
return http.build();
}


@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder(8);
}

} 

Kotlin中的全局过滤器实现,我想要Java8 中的代码

@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())
}
}

Application.properties配置

server:
port: 8080

eureka:
client:
serviceUrl:
defaultZone: http://localhost:8083/eureka 
spring:
main:
allow-bean-definition-overriding: true
application:
name: gateway
cloud:
gateway:
routes:
- id: userModule
uri: lb://user
predicates:
- Path=/user/**

我相信这有点像遵循

@Component
public class AddCredentialsGlobalFilter implements GlobalFilter {
private final String usernameHeader = "logged-in-user";
private final String rolesHeader = "logged-in-user-roles";
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return exchange.getPrincipal().flatMap(p -> {
List<GrantedAuthority> authorities = (List<GrantedAuthority>) ((Authentication)p).getAuthorities();
String rolesString = authorities != null 
? authorities.stream().map(Object::toString).collect(Collectors.joining(";"))
: "";
ServerHttpRequest request = exchange.getRequest().mutate()
.header(usernameHeader, p.getName())
.header(rolesHeader, rolesString)
.build();
return chain.filter(exchange.mutate().request(request).build());
});
}
}

最新更新