在Quarkus中从REST请求获取Authorization Bearer Token
在Quarkus中获取请求的Bearer Token并解决401问题
一、在Quarkus中获取Bearer Token的方法
Quarkus完全兼容JAX-RS的@Context注解,你可以沿用Java EE的方式实现,主要有两种注入形式:
1. 类级别注入
直接在资源类中注入HttpHeaders实例,全局使用:
import javax.ws.rs.core.Context; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; @Path("/mailbox") public class MailboxResource { @Context private HttpHeaders headers; @GET @Path("/all") @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8") public Response getAllMailbox(@DefaultValue("0") @QueryParam("page") int page, @DefaultValue("20") @QueryParam("max") int max, @DefaultValue("mail.receivedate") @QueryParam("orderby") String orderby, @DefaultValue("") @QueryParam("search") String search) { // 提取Bearer Token String authHeader = headers.getHeaderString(HttpHeaders.AUTHORIZATION); String token = null; if (authHeader != null && authHeader.startsWith("Bearer ")) { token = authHeader.substring(7); // 去掉"Bearer "前缀 } MailboxResponse mailboxResponse; try { mailboxResponse = mailboxManager.getAllMailbox(search, page, max, orderby, asc, token); } catch (Exception e) { return Response.serverError().build(); } return Response.status(Response.Status.OK).entity(mailboxResponse).build(); } }
2. 方法参数注入
将HttpHeaders作为方法参数直接注入,适合仅在单个方法中使用的场景:
@GET @Path("/all") @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8") public Response getAllMailbox(@DefaultValue("0") @QueryParam("page") int page, @DefaultValue("20") @QueryParam("max") int max, @DefaultValue("mail.receivedate") @QueryParam("orderby") String orderby, @DefaultValue("") @QueryParam("search") String search, @Context HttpHeaders headers) { // 直接注入到方法参数 String authHeader = headers.getHeaderString(HttpHeaders.AUTHORIZATION); String token = null; if (authHeader != null && authHeader.startsWith("Bearer ")) { token = authHeader.substring(7); } MailboxResponse mailboxResponse; try { mailboxResponse = mailboxManager.getAllMailbox(search, page, max, orderby, asc, token); } catch (Exception e) { return Response.serverError().build(); } return Response.status(Response.Status.OK).entity(mailboxResponse).build(); }
二、解决添加授权头后返回401的问题
出现401的核心原因是Quarkus自动启用了安全校验机制(比如引入了quarkus-smallrye-jwt、quarkus-security等扩展),带有Authorization头的请求会被自动拦截校验,而你的接口未配置放行规则。
针对性解决方案:
移除不必要的安全依赖
查看项目的pom.xml(Maven)或build.gradle(Gradle),如果不需要全局安全校验,直接移除安全相关依赖,比如:<!-- 若不需要JWT校验,移除该依赖 --> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-smallrye-jwt</artifactId> </dependency>配置接口放行
如果需要保留安全依赖但该接口无需授权校验,在方法或类上添加@PermitAll注解(需确保引入quarkus-security依赖):import io.quarkus.security.PermitAll; @GET @Path("/all") @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8") @PermitAll // 允许所有请求访问,包括带授权头的请求 public Response getAllMailbox(...) { // 业务逻辑 }关闭全局安全校验
如果整个应用都不需要默认安全校验,在application.properties中添加配置:quarkus.security.enabled=false
内容的提问来源于stack exchange,提问作者stg
相关产品推荐
相关产品推荐

