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

如何为自托管Strapi配置Azure Entra ID认证连接PostgreSQL?

如何为自托管Strapi配置Azure Entra ID无密码连接PostgreSQL

Strapi本身没有直接提供Azure Entra ID(原Azure AD)认证的配置项,但可以通过PostgreSQL客户端库(pg)的扩展能力,结合Azure身份验证库实现无密码连接。以下是具体实现步骤:

1. 安装依赖

首先安装Azure身份验证库,用于动态获取AD访问令牌:

npm install @azure/identity

pg是Strapi连接PostgreSQL的默认依赖,无需重复安装。

2. 修改Strapi数据库配置

编辑Strapi的数据库配置文件(通常为config/database.js,TypeScript项目为config/database.ts),替换原有的用户名/密码配置,改为动态获取AD令牌并配置连接池自动刷新:

JavaScript版本示例

const { DefaultAzureCredential } = require('@azure/identity');

module.exports = ({ env }) => {
  // 初始化Azure默认凭据,自动适配本地/生产环境的身份验证方式
  const credential = new DefaultAzureCredential();

  // 获取PostgreSQL的Azure AD访问令牌
  const getAccessToken = async () => {
    // PostgreSQL的AD资源标识固定为https://ossrdbms-aad.database.windows.net/.default
    const token = await credential.getToken('https://ossrdbms-aad.database.windows.net/.default');
    return token.token;
  };

  return {
    connection: {
      client: 'postgres',
      connection: {
        host: env('DATABASE_HOST', '<your-db-server>.postgres.database.azure.com'),
        port: env.int('DATABASE_PORT', 5432),
        database: env('DATABASE_NAME', '<your-db-name>'),
        // 此处填写有权限连接数据库的Azure AD主体名称(如用户邮箱、服务主体ID)
        user: env('DATABASE_AD_USER', '<azure-ad-principal>'),
        // 动态注入AD令牌作为密码
        password: getAccessToken(),
        ssl: {
          rejectUnauthorized: env.bool('DATABASE_SSL', true),
        },
        // 配置连接池自动刷新令牌,避免令牌过期导致连接失效
        pool: {
          refreshAuthCallback: async (client) => {
            const newToken = await getAccessToken();
            client.password = newToken;
            return newToken;
          },
          // 每30分钟刷新一次令牌(Azure AD令牌有效期通常为60分钟)
          refreshAuthIntervalMillis: 30 * 60 * 1000,
        },
      },
      useNullAsDefault: true,
    },
  };
};

TypeScript版本示例

import { DefaultAzureCredential } from '@azure/identity';
import type { StrapiConfig } from '@strapi/types';

export default ({ env }: StrapiConfig) => {
  const credential = new DefaultAzureCredential();

  const getAccessToken = async () => {
    const token = await credential.getToken('https://ossrdbms-aad.database.windows.net/.default');
    return token?.token || '';
  };

  return {
    connection: {
      client: 'postgres',
      connection: {
        host: env('DATABASE_HOST', '<your-db-server>.postgres.database.azure.com'),
        port: env.int('DATABASE_PORT', 5432),
        database: env('DATABASE_NAME', '<your-db-name>'),
        user: env('DATABASE_AD_USER', '<azure-ad-principal>'),
        password: getAccessToken(),
        ssl: {
          rejectUnauthorized: env.bool('DATABASE_SSL', true),
        },
        pool: {
          refreshAuthCallback: async (client) => {
            const newToken = await getAccessToken();
            client.password = newToken;
            return newToken;
          },
          refreshAuthIntervalMillis: 30 * 60 * 1000,
        },
      },
      useNullAsDefault: true,
    },
  };
};

3. 环境配置与权限验证

  • 本地开发:确保已通过Azure CLI登录(az login),DefaultAzureCredential会自动使用CLI的身份信息。
  • 生产环境:可使用Azure托管标识、服务主体等方式,确保Strapi运行环境拥有获取AD令牌的权限。
  • 数据库权限:确保配置的Azure AD主体已被授予PostgreSQL数据库的访问权限(如添加为数据库用户并分配对应角色)。
  • 服务器配置:Azure PostgreSQL服务器已启用Azure AD认证(在Azure门户的服务器“身份验证”选项卡中配置)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 00:02:12