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

如何在Quarkus的OIDC流程中拦截验证邮箱并阻止未邀请用户登录?

在Quarkus OIDC流程中拦截验证受邀邮箱

完全可以在Quarkus的OIDC认证流程中直接拦截校验受邀邮箱,避免在多个端点重复逻辑。核心思路是利用Quarkus OIDC提供的扩展点,在用户从Google IDP跳转回应用的认证回调阶段,自动校验用户邮箱是否在受邀名单中,不符合则直接终止认证流程。

以下是两种简单可行的实现方式:

方式一:使用OidcUserInfoCustomizer(推荐,更早拦截)

这个扩展点会在Quarkus获取到Google返回的用户信息(UserInfo)后立即触发校验,能更早终止无效流程:

import io.quarkus.oidc.UserInfo;
import io.quarkus.oidc.runtime.OidcUserInfoCustomizer;
import io.quarkus.security.AuthenticationFailedException;
import jakarta.enterprise.context.ApplicationScoped;
import java.util.Set;

@ApplicationScoped
public class InviteOnlyUserChecker implements OidcUserInfoCustomizer {

    // 实际场景建议从数据库/配置中心读取受邀列表
    private static final Set<String> INVITED_EMAILS = Set.of("allowed1@domain.com", "allowed2@domain.com");

    @Override
    public void customize(UserInfo userInfo) {
        String userEmail = userInfo.getString("email");
        // 校验邮箱是否存在且在受邀列表中
        if (userEmail == null || !INVITED_EMAILS.contains(userEmail)) {
            throw new AuthenticationFailedException("您未被授权访问该系统");
        }
    }
}

方式二:使用SecurityIdentityAugmentor

如果需要对已构建的SecurityIdentity做额外校验或增强,可选择这个扩展点:

import io.quarkus.security.identity.SecurityIdentity;
import io.quarkus.security.identity.SecurityIdentityAugmentor;
import io.quarkus.security.identity.request.AuthenticationRequest;
import io.quarkus.security.AuthenticationFailedException;
import io.smallrye.mutiny.Uni;
import jakarta.enterprise.context.ApplicationScoped;
import java.util.Set;

@ApplicationScoped
public class InviteOnlyIdentityAugmentor implements SecurityIdentityAugmentor {

    private static final Set<String> INVITED_EMAILS = Set.of("allowed1@domain.com", "allowed2@domain.com");

    @Override
    public Uni<SecurityIdentity> augment(SecurityIdentity identity, AuthenticationRequest request) {
        // 从OIDC claims中提取邮箱(Google的邮箱claim键为"email")
        String userEmail = identity.getPrincipal().getAttribute("email");
        if (userEmail == null || !INVITED_EMAILS.contains(userEmail)) {
            return Uni.createFrom().failure(new AuthenticationFailedException("您未被邀请访问此系统"));
        }
        // 校验通过,返回原身份信息或增强后的信息
        return Uni.createFrom().item(identity);
    }
}

必要的配置补充

在application.properties中确保请求了email scope,这样才能从Google获取到用户邮箱:

quarkus.oidc.client-id=你的Google客户端ID
quarkus.oidc.client-secret=你的Google客户端密钥
quarkus.oidc.auth-server-url=https://accounts.google.com/.well-known/openid-configuration
# 必须包含email scope才能获取邮箱信息
quarkus.oidc.scopes=openid,email,profile

效果说明

当用户通过Google登录后跳转回应用时,Quarkus会自动触发上述自定义逻辑:

  • 若邮箱在受邀列表中,认证流程正常完成,用户可访问受保护资源
  • 若邮箱不在列表中,会抛出AuthenticationFailedException,认证流程终止,默认返回401 Unauthorized(你可以通过实现ExceptionMapper自定义错误页面或响应)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 04:05:38