java - 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)
}
}
}
解决方案
推荐阅读
- javascript - 单击其他菜单项时隐藏当前子菜单
- qt - QwtScaleWidget::scaleDivChanged 仅适用于旧语法
- c# - 在 .Net Core 2 中使用 Guid.NewGuid() 获取随机实体(包括子实体)
- r - 返回与“summarise”返回的值相关联的列的值,用于另一列
- webpack - 有没有办法使用 requirejs 的 require 函数来加载 webpack 包?
- dart - 如何实现谷歌身份验证检查
- c - 使用命名管道的进程间通信
- java - 实现合并排序
- c# - 将 MessageBox 与 CellValidating 事件一起使用时出现异常
- dart - 如何设置 Flutter iPhone X 安全区域