繁体   English   中英

PHP Laravel 与 MS SQL Azure 数据库连接具有 Azure Active Directory - 通用 MFA 启用

[英]PHP Laravel with MS SQL Azure database connection having Azure Active Directory - Universal with MFA enables

我们有具有 MS SQL 数据库连接的 Laravel 应用程序。 SQL 数据库托管在 microsoft azure app 服务上。

要使用 Laravel 将数据库与 MS SQL 连接,我们已经按照链接中给出的说明安装了 Microsoft SQL Server (Ubuntu) 所需的 PHP 驱动程序。 https://docs.microsoft.com/en-us/sql/connect/php/installation-tutorial-linux-mac?view=sql-server-ver15

按照上面链接中的步骤,我们的 Laravel Web APP 与 MS SQL 数据库的连接工作正常,我们能够对数据库执行查询。

现在客户端已启用 Azure Active Directory – Universal with MFA Authentication 来访问数据库。 所以我们的数据库连接现在不起作用。 我们在 .env 文件中有以下代码来连接 SQL 数据库。

DB_CONNECTION_sqlsrv=sqlsrv
DB_HOST_sqlsrv=sql-server-host-name
DB_PORT_sqlsrv=1433
DB_DATABASE_sqlsrv=sql-database-name
DB_USERNAME_sqlsrv= sql-database-username
DB_PASSWORD_sqlsrv= sql-database-password

为了验证数据库连接,我们正在尝试从 SSMS(来自窗口的应用程序)连接数据库,以验证凭据和连接在那里正常工作。

在此处输入图像描述

但是我们的 Laravel 连接在这里不起作用。 那么是否有任何替代方式或任何参数我们必须传递来连接具有 Azure Active Directory 的 MS SQL 数据库,并在 Azure App Server 上启用了 MFA? 如果没有启用身份验证,数据库连接对我们来说工作得很好。 任何帮助,将不胜感激。

经过一番研究,我们找到了解决方案。 我们通过扩展可以完成 ActiveDirectoryPassword 身份验证的默认数据库连接类来解决它。 代表解决方案,我们遵循以下步骤。

步骤1:

我们在app下创建了一个新文件夹,并将以下核心文件复制过来。

       ◦ Custom
           ▪ Database
               • Connectors
                   ◦ ConnectionFactory.php
                   ◦ SqlServerConnector.php

这些核心文件可以在 vendor/laravel/framework/src/Illuminate/ 中找到。 这里的目标是扩展基类,然后在数据库服务提供程序中加载扩展类。 在我们复制了这些文件之后,我们已经编辑了这些文件。

第2步:

转到您的应用程序 > 自定义 > 数据库 > 连接器 > ConnectionFactory.php

更改命名空间。

namespace App\Custom\Database\Connectors;

导入原始类,以便我们可以扩展它。

use Illuminate\Database\Connectors\ConnectionFactory as BaseFactory;

class ConnectionFactory extends BaseFactory {

注释掉原始类并将其替换为新的扩展类。

/*use Illuminate\Database\Connectors\SqlServerConnector;*/ use App\Custom\Database\Connectors\SqlServerConnector;

第 3 步:

然后转到应用程序 > 自定义 > 数据库 > 连接器 > SqlServerConnector.php

在这个文件中,我们需要为 getSqlSrvDsn() 方法添加一些额外的属性。

更新了命名空间。

namespace App\Custom\Database\Connectors;

添加所需的类。

use Illuminate\Database\Connectors\ConnectorInterface; use Illuminate\Database\Connectors\Connector;

通过添加以下属性更新 getSqlSrvDsn()。

//Added to support ActiveDirectoryPassword

if (isset($config['authentication'])) { $arguments['Authentication'] = $config['authentication']; }

第4步:

将“身份验证”添加到属性后,更新 database.php 中的 sqlsrv 连接设置数组。

'authentication' => env('DB_AUTHENTICATION', 'ActiveDirectoryPassword'),

我们将默认设置为 SqlPassword。 为了使用 Active Directory Managed Identities,我们可以在 .env 文件中将其设置为“ActiveDirectoryPassword”

在 config/database.php 添加 'authentication' => 'ActiveDirectoryPassword',并检查默认连接,如下所示:

//'default' => env('DB_CONNECTION', 'mysql'),
'default' => env('DB_CONNECTION', 'sqlsrv'), 

'sqlsrv' => [
            'driver' => 'sqlsrv',
            'url' => env('DATABASE_URL_sqlsrv'),
            'host' => env('DB_HOST_sqlsrv', 'hostname.dbmssql.com'),
            'port' => env('DB_PORT_sqlsrv', '1433'),
            'database' => env('DB_DATABASE_sqlsrv', 'sqldb'),
            'username' => env('DB_USERNAME_sqlsrv', 'SqlUsername'),
            'password' => env('DB_PASSWORD_sqlsrv', 'SqlPassword'),
            'authentication' => env('DB_AUTHENTICATION', 'ActiveDirectoryPassword'),
            'charset' => 'utf8',
            'prefix' => '',
            'prefix_indexes' => true,
        ],

第 5 步:

接下来,创建一个新的 DatabaseServiceProvider.php 以使用我们的自定义 ConnectionFactory。

php artisan make:provider DatabaseServiceProvider

复制位于以下位置的现有 DatabaseServiceProvider 代码:

Illuminate\Database\DatabaseServiceProvider

更新 ConnectionFactory 类以获取我们的自定义 ConnectionnFactory。

/*use Illuminate\Database\Connectors\ConnectionFactory;*/
use App\Custom\Database\Connectors\ConnectionFactory;

在 DatabaseServiceProvider 中添加以下包

use Illuminate\Database\DatabaseManager;
use Illuminate\Database\DatabaseTransactionsManager;
use Illuminate\Support\ServiceProvider;

第 6 步:

最后,在我们的 app/config/app.php 文件中,注释掉现有的 DatabaseServiceProvider。

/*Illuminate\Database\DatabaseServiceProvider::class,*/

并添加我们新的 DatabaseServiceProvider。

App\Providers\DatabaseServiceProvider::class,

按照上述步骤,连接工作正常并且能够从 Laravel 8 访问数据库。

您可以立即到此位置编辑 vendor\laravel\framework\src\Illuminate\Database\Connectors\SqlServerConnector.php 在 getSqlSrvDsn() 函数中只需添加此代码

    if (isset($config['authentication'])) {
        $arguments['Authentication'] = $config['authentication'];
      }

之后,您需要通过

'authentication'=>'ActiveDirectoryMsi'

在 config/database.php 的数据库连接数组中,应该可以正常工作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM