You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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头的请求会被自动拦截校验,而你的接口未配置放行规则。

针对性解决方案:

  1. 移除不必要的安全依赖
    查看项目的pom.xml(Maven)或build.gradle(Gradle),如果不需要全局安全校验,直接移除安全相关依赖,比如:

    <!-- 若不需要JWT校验,移除该依赖 -->
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-smallrye-jwt</artifactId>
    </dependency>
    
  2. 配置接口放行
    如果需要保留安全依赖但该接口无需授权校验,在方法或类上添加@PermitAll注解(需确保引入quarkus-security依赖):

    import io.quarkus.security.PermitAll;
    
    @GET
    @Path("/all")
    @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
    @PermitAll // 允许所有请求访问,包括带授权头的请求
    public Response getAllMailbox(...) {
        // 业务逻辑
    }
    
  3. 关闭全局安全校验
    如果整个应用都不需要默认安全校验,在application.properties中添加配置:

    quarkus.security.enabled=false
    

内容的提问来源于stack exchange,提问作者stg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 20:39:19