DBeaver不支持动态口令原生集成,因JDBC协议仅传静态user/password字段,无法触发OTP交互;常见“Access denied”实为静态密码未拼接动态码、驱动版本过低、时钟不同步或未重启DBeaver加载新驱动所致。

DBeaver 本身不支持动态口令(如 Google Authenticator、RSA SecurID、TOTP 或银行U盾类一次性密码)的原生集成,必须依赖 JDBC 驱动层或操作系统级认证机制来中转。
为什么 DBeaver 测试连接总提示“Access denied”但账号密码没错
常见现象是:手动用 mysql 命令行或 Navicat 能连(因它们调用了系统 PAM 或支持 OTP 插件),而 DBeaver 直接填用户名+静态密码就失败。这是因为 DBeaver 的 JDBC 连接流程里没有触发 OTP 输入环节——JDBC 协议本身不定义动态口令交互,它只传 user 和 password 两个字符串字段。
- MySQL 8.0+ 启用
caching_sha2_password+ TOTP 插件时,需驱动支持authenticationPlugins参数,且 DBeaver 必须把 OTP 当作password字段的一部分拼接(如静态密码+动态6位) - Oracle 使用 Oracle Wallet + OS authentication 时,DBeaver 若没配置
oracle.net.authentication_services=(KERBEROS5)或未启用os_authent_prefix,会跳过系统级令牌校验 - PostgreSQL 启用
auth_delay或pam模块后,DBeaver 默认不触发 PAM 对话,导致 OTP prompt 被忽略
MySQL 动态口令:在 connection URL 里硬编码 OTP 拼接
适用于 MySQL 官方驱动(mysql-connector-java 8.0.28+)已启用 OTP 插件(如 oath_auth)的场景。此时不能只填 UI 表单里的 Password,而要改 JDBC URL:
jdbc:mysql://host:3306/db?user=myuser&password=mypass123456&authenticationPlugins=com.mysql.cj.plugin.sha256.Sha256PasswordPlugin
-
myuser是数据库用户名,不是 OTP 账户名 -
mypass123456必须是「静态密码 + 当前动态口令」拼成的完整字符串(例如静态密码为abc,当前 TOTP 是789012,则此处填abc789012) - 确保驱动版本 ≥ 8.0.28,旧版不识别
authenticationPlugins参数 - DBeaver 的 UI 密码框留空,所有凭据塞进 URL —— 否则 UI 输入的密码会覆盖 URL 中的
password
Oracle / PostgreSQL:用 SSH 隧道 + 本地代理绕过 OTP 校验
当数据库服务器本身启用了 PAM/TOTP,但 JDBC 驱动不支持交互式 OTP 输入时,最稳的方式是让认证发生在 SSH 层而非数据库层:
- 在 DBeaver 连接配置的
SSH Configuration页签中启用隧道,填入能通过动态口令登录的跳板机(如堡垒机) - 数据库主机填
127.0.0.1,端口填跳板机上用ssh -L映射的本地端口(如127.0.0.1:13306) - 跳板机上执行:
ssh -L 13306:db-host:3306 user@bastion-host,其中user@bastion-host登录时输入动态口令 - 这样 DBeaver 实际连的是本地端口,认证由 SSH 完成,数据库侧看到的是跳板机内网 IP,无需再验 OTP
容易被忽略的关键点
很多人卡在「明明 URL 拼对了 OTP,还是连不上」,问题往往出在时钟同步或 JDBC 驱动加载时机:
- 动态口令(尤其是 TOTP)严重依赖客户端和服务端系统时间差 ≤ 30 秒,DBeaver 运行所在机器若未开启 NTP 同步,OTP 值必然失效
- DBeaver 启动后才加载 JDBC 驱动,若你中途替换了
mysql-connector-java.jar,必须重启 DBeaver,否则旧驱动仍在内存中运行 - 某些 OTP 插件(如 MySQL 的
oath_auth)要求用户账户必须用CREATE USER ... IDENTIFIED WITH oath_auth显式声明,仅靠 GRANT 不生效











