Spring Boot部署K8s后如何通过Active Directory用户连接MSSQL数据库
解决方案
根因分析
你遇到的报错是jTDS驱动的AD认证机制本身的适配局限导致的:
integratedSecurity=true依赖Windows系统自带的SSPI认证库,你部署在K8s的容器绝大多数是Linux环境,没有对应的依赖组件,直接启用必然认证失败- 仅添加
domain=domain-name参数时,jTDS默认使用的NTLMv1认证要求应用所在节点必须加入目标AD域,未加域的K8s节点会被AD判定为不可信来源,触发不可信域报错
最优配置方案(使用微软官方JDBC驱动)
推荐直接替换为微软官方的MSSQL JDBC驱动,原生支持跨平台的AD账号密码认证,适配Linux容器场景:
- 替换驱动依赖,Maven配置示例如下:
<dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <version>12.4.2.jre11</version> <!-- 可根据你使用的JDK版本选择对应后缀的驱动版本,如jre8、jre17 --> </dependency>
- 修改驱动类配置:
spring.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
- 修改连接字符串,启用AD密码认证模式:
datasourceUrl: jdbc:sqlserver://server-host:1433;databaseName=db-name;instanceName=MSSQL;authentication=ActiveDirectoryPassword
- 账号密码配置填写完整AD账号:
spring.datasource.username=ad-username@your-domain.com spring.datasource.password=ad账号对应的密码
兼容jTDS驱动的临时方案
如果暂时无法替换驱动,可以调整连接字符串参数强制使用NTLMv2认证:
datasourceUrl: jdbc:jtds:sqlserver://server-host/db-name;instance=MSSQL;domain=domain-name;useNTLMv2=true
注意用户名仅填写AD账号前缀即可,不要加域名后缀。该方案要求数据库端开启了NTLMv2认证支持,且K8s集群网络可正常访问AD域的认证端口。
排查注意事项
- 确认AD账号已在MSSQL中创建登录名,且分配了目标数据库的访问权限
- 确认K8s节点到数据库端口(默认1433,命名实例可能为动态端口,建议固定端口)的网络连通性
- Linux环境下不要使用
integratedSecurity=true参数,该参数仅支持Windows部署场景 - 不要在用户名和连接字符串中重复配置域名,避免认证冲突
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

