如何让Vert.x JWTAuthHandler仅注入User对象不拒绝未授权请求
实现方案
问题原理
默认JWTAuthHandler为强制认证模式,只要请求无合法授权信息就直接返回401响应,不会进入后续业务逻辑;若不挂载该处理器,框架不会自动解析请求中的JWT凭证,RoutingContext.user()自然返回null。
解决步骤
你可以自定义一个可选JWT解析处理器,仅在请求携带有效Bearer Token时解析并注入用户对象,所有情况都会放行到后续业务逻辑:
- 编写自定义可选JWT处理器
import io.vertx.core.http.HttpHeaders; import io.vertx.ext.auth.jwt.JWTAuth; import io.vertx.ext.web.RoutingContext; // 你的JWTAuth实例,提前完成签名密钥等配置 JWTAuth jwtAuth = 你已初始化的JWTAuth实例; Handler<RoutingContext> optionalJwtHandler = ctx -> { String authHeader = ctx.request().getHeader(HttpHeaders.AUTHORIZATION); // 仅处理Bearer类型的授权头 if (authHeader != null && authHeader.startsWith("Bearer ")) { String token = authHeader.substring("Bearer ".length()); // 异步解析JWT jwtAuth.authenticate(JsonObject.of("token", token), res -> { if (res.succeeded()) { // 解析成功则注入用户对象到上下文 ctx.setUser(res.result()); } // 无论解析结果如何都放行到后续逻辑 ctx.next(); }); return; } // 无授权头直接放行 ctx.next(); };
- 挂载处理器到路由
// 按顺序挂载自定义处理器、业务处理器 router.route("/你的接口路径") .handler(optionalJwtHandler) .handler(yourBusinessHandler);
- 业务逻辑中按需判断登录状态
Handler<RoutingContext> yourBusinessHandler = ctx -> { if (ctx.user() != null) { // 已登录用户逻辑,可从user中读取JWT载荷信息 String userId = ctx.user().principal().getString("userId"); // 对应业务处理 } else { // 未登录用户逻辑 // 对应业务处理 } };
可选调整
如果需要对非法/过期Token返回错误提示,可在authenticate回调的失败分支中主动构造错误响应返回,无需调用ctx.next()即可中断后续流程。
内容的提问来源于stack exchange,提问作者Jason Lee
相关产品推荐
相关产品推荐

