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

在Quarkus中使用自定义IdentityProvider对接MongoDB认证

Quarkus适配MongoDB实现身份认证方案

完全可以通过自定义身份提供者(IdentityProvider)实现Quarkus与MongoDB的认证集成,这是Quarkus安全架构的标准扩展方式,已有不少开发者成功适配过MongoDB这类非JPA场景,以下是具体实现步骤:

1. 依赖准备

先添加必要的Quarkus扩展依赖:

  • quarkus-security:核心安全框架
  • quarkus-mongodb-panache:简化MongoDB操作
  • quarkus-bcrypt:密码加密与校验(推荐用于密码存储)

2. 定义MongoDB用户实体

创建对应MongoDB用户集合的实体类,用Panache简化CRUD操作:

import io.quarkus.mongodb.panache.PanacheMongoEntity;
import io.quarkus.mongodb.panache.common.MongoEntity;

@MongoEntity(collection = "users")
public class User extends PanacheMongoEntity {
    public String username;
    public String passwordHash; // 存储BCrypt加密后的密码
    public String[] roles;      // 用户角色,用于权限控制
}

3. 自定义IdentityProvider

实现Quarkus的IdentityProvider接口,处理用户名密码的认证逻辑,从MongoDB查询用户并校验凭证:

import io.quarkus.security.credential.PasswordCredential;
import io.quarkus.security.identity.IdentityProviderManager;
import io.quarkus.security.identity.SecurityIdentity;
import io.quarkus.security.identity.request.UsernamePasswordAuthenticationRequest;
import io.quarkus.security.runtime.identity.IdentityProviderImpl;
import io.quarkus.security.runtime.identity.SecurityIdentityBuilder;
import jakarta.enterprise.context.ApplicationScoped;
import org.mindrot.jbcrypt.BCrypt;

@ApplicationScoped
public class MongoDbUsernamePasswordProvider extends IdentityProviderImpl<UsernamePasswordAuthenticationRequest> {

    @Override
    public Class<UsernamePasswordAuthenticationRequest> getRequestType() {
        return UsernamePasswordAuthenticationRequest.class;
    }

    @Override
    public SecurityIdentity authenticate(UsernamePasswordAuthenticationRequest request, IdentityProviderManager identityProviderManager) {
        String username = request.getUsername();
        PasswordCredential passwordCred = request.getPassword();
        char[] rawPassword = passwordCred.getPassword();

        // 从MongoDB查询用户
        User user = User.find("username", username).firstResult();
        if (user == null) {
            return null; // 用户不存在,认证失败
        }

        // 校验密码(BCrypt匹配)
        if (!BCrypt.checkpw(new String(rawPassword), user.passwordHash)) {
            return null; // 密码不匹配,认证失败
        }

        // 构建SecurityIdentity,包含用户身份与角色
        return SecurityIdentityBuilder.builder()
                .setPrincipal(() -> username)
                .addRoles(user.roles)
                .build();
    }
}

4. 配置认证机制

如果是表单认证,可在application.properties中配置:

quarkus.http.auth.form.enabled=true
quarkus.http.auth.form.login-page=/login
quarkus.http.auth.form.error-page=/login-error
quarkus.http.auth.form.post-location=/j_security_check

如果是API接口常用的Bearer Token认证,可结合Quarkus JWT扩展,自定义Token校验逻辑时从MongoDB验证用户有效性即可。

补充说明

  • 密码加密:用户注册时需用BCrypt加密密码后存入MongoDB,示例代码:String hashed = BCrypt.hashpw(rawPassword, BCrypt.gensalt());
  • 权限控制:通过@RolesAllowed注解配合用户角色实现接口权限校验
  • 扩展场景:除了用户名密码认证,还可以扩展实现OAuth2、JWT refresh token存储到MongoDB等场景,核心都是通过自定义Provider接入MongoDB数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 07:20:48