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

