簡體   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