首页 > 解决方案 > Spring Cloud Gateway Filter - 自定义异常响应

问题描述

我正在实现 spring 云网关 .. 我想要做的是创建一个过滤器来验证用户的 jwt 令牌,如果令牌不存在或无效,我会修改响应,以便客户端接收个性化以 401 代码响应。

{
    "status": "UNAUTHORIZED",
    "message": "Your token is not valid"
}

直到这一步,一切都很好。但是当我继续我的过滤器并尝试与用户微服务通信以验证用户时,就会出现问题。我似乎无法返回结构错误,我想表明该用户无效(如果他被禁止或其他原因)

这是我的过滤器

@Component
class AuthFilter : AbstractGatewayFilterFactory<Any>()
{
    @Autowired
    private lateinit var webClientBuilder : WebClient.Builder
    
    
    
    private fun onError(exchange : ServerWebExchange) : Mono<Void?>
    {
        val exception = BaseApiBody()
        exception.status = UNAUTHORIZED
        exception.message = "Please use a valid jwt"
        
        exchange.response.headers.contentType = MediaType.APPLICATION_JSON
        exchange.response.statusCode = UNAUTHORIZED
        
        val response = ObjectMapper().writeValueAsString(exception).toByteArray(StandardCharsets.UTF_8)
        
        val buffer = exchange.response.bufferFactory().wrap(response)
        
        return exchange.response.writeWith(Flux.just(buffer))
    }
    
    
    private fun isJwtValid(jwt : String) : Boolean
    {
        // my verification code
    }
    
    
    override fun apply(config : Any?) : GatewayFilter
    {
        return GatewayFilter { exchange, chain ->
            
            val jwtToken = exchange.request.headers[HttpHeaders.AUTHORIZATION]?.get(0)
            
            if (jwtToken == null || !isJwtValid(jwtToken))
            {
                return@GatewayFilter onError(exchange)
            }
            
            return@GatewayFilter webClientBuilder.build()
                .get()
                .uri("http://users-service/users/test")
                .retrieve()
                .bodyToMono(UserDto::class.java)
                .map { userDto ->
                    
                    if (userDto.state == BLOCKED)
                    {
                        //I want to stop the filter and return a custom response but i can't find a way
                    }
                    
                    exchange
                    
                }.flatMap(chain::filter)
        }
    }
}

标签: javakotlinspring-securityspring-cloud-gateway

解决方案


推荐阅读