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

Spring Webflux中R2dbc Mssql Azure AD服务主体登录失败求助

关于R2DBC连接Azure SQL使用AD服务主体登录的解决方案

r2dbc-mssql是支持Azure Active Directory服务主体登录的,你之前的尝试失败是因为没有使用正确的认证配置方式。

问题原因分析

  • 直接将Azure AD token作为密码传入:Azure AD的access token长度通常远超128字符,而SQL Server的密码字段有长度限制,因此触发Password name must be shorter than 128 chars错误。
  • 直接用clientId作为用户名、clientSecret作为密码:驱动默认使用SQL Server身份认证,而非AD服务主体认证,所以无法完成身份校验,导致Failed to obtain R2DBC Connection。

正确配置方式

需要使用r2dbc-mssql提供的专属认证选项,指定认证方法为ActiveDirectoryServicePrincipal,并传入tenantId、clientId、clientSecret参数。

代码示例

import io.r2dbc.mssql.MssqlConnectionFactoryProvider;
import io.r2dbc.spi.ConnectionFactory;
import io.r2dbc.spi.ConnectionFactoryOptions;

ConnectionFactory connectionFactory = ConnectionFactories.get(ConnectionFactoryOptions.builder()
        .option(ConnectionFactoryOptions.DRIVER, "mssql")
        .option(ConnectionFactoryOptions.HOST, "mydatabase-url.database.windows.net")
        .option(ConnectionFactoryOptions.PORT, 1433)
        .option(ConnectionFactoryOptions.DATABASE, "mydatabase")
        // 指定AD服务主体认证方式
        .option(MssqlConnectionFactoryProvider.AUTHENTICATION_METHOD, "ActiveDirectoryServicePrincipal")
        // 传入AD租户ID
        .option(MssqlConnectionFactoryProvider.TENANT_ID, "你的tenantId")
        // 服务主体的clientId
        .option(MssqlConnectionFactoryProvider.CLIENT_ID, "你的clientId")
        // 服务主体的clientSecret
        .option(MssqlConnectionFactoryProvider.CLIENT_SECRET, "你的clientSecret")
        .option(ConnectionFactoryOptions.SSL, true) // Azure SQL必须启用SSL,你之前设为false是错误的!
        .build());

关键注意事项

  1. 必须启用SSL:Azure SQL数据库强制要求SSL连接,你之前配置SSL, false会导致连接失败,务必改为true。
  2. 版本要求:确保使用r2dbc-mssql 1.0.3.RELEASE及以上版本,该版本完善了AD服务主体认证的支持。
  3. 权限配置:确保你的服务主体已被授予Azure SQL数据库的访问权限(比如添加为数据库用户并分配对应角色)。

Spring Boot配置文件写法(可选)

如果使用Spring Boot,可以在application.yml中直接配置:

spring:
  r2dbc:
    url: r2dbc:mssql://mydatabase-url.database.windows.net:1433/mydatabase?authenticationMethod=ActiveDirectoryServicePrincipal&tenantId=你的tenantId&clientId=你的clientId&clientSecret=你的clientSecret
    properties:
      ssl: true

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 07:13:13