如何在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
相关产品推荐
相关产品推荐

