5.3 驗證支援

對於使用舊版 JDBC API(即,未使用 X DevAPI 或 X DevAPI for C)連線到伺服器的連線,Connector/C++ 支援不同的用戶端驗證外掛程式和驗證方法,適用於

LDAP 驗證

LDAP 驗證使 Connector/C++(8.0.22 及更高版本)應用程式可以使用簡單 LDAP 驗證,或使用 SCRAM-SHA-1 驗證方法的 SASL LDAP 驗證來連線到 MySQL 伺服器。LDAP 驗證需要使用來自 MySQL 企業版的伺服器。有關 LDAP 驗證外掛程式的更多資訊,請參閱LDAP 可插拔驗證

Connector/C++ 二進位發行版本包含提供用戶端 LDAP 驗證外掛程式的程式庫,以及外掛程式所需的任何相依程式庫。

注意

在 Connector/C++ 8.0.23 中,已移除對 mysql-client-plugins 套件的相依性。此套件現在僅在 Connector/C++ 應用程式使用具有 LDAP 驗證的商業 MySQL 伺服器帳戶進行連線的主機上才需要。在這種情況下,還必須安裝其他程式庫:使用 RPM 套件安裝的cyrus-sasl-scram和使用 Debian 套件安裝的libsasl2-modules-gssapi-mit。這些 SASL 套件提供使用 SCRAM-SHA-256 和 GSSAPI/Kerberos LDAP 驗證方法所需之支援。

如果 Connector/C++ 是從壓縮的 tar 檔案或 Zip 封存檔安裝的,則應用程式需要將 OPT_PLUGIN_DIR 連線選項設定為適當的目錄,以便可以找到捆綁的外掛程式程式庫。(或者,將所需的外掛程式程式庫複製到用戶端程式庫預期的預設目錄。)

例如

sql::ConnectOptionsMap connection_properties;

// To use simple LDAP authentication ...

connection_properties["userName"] = "simple_ldap_user_name";
connection_properties["password"] = "simple_ldap_password";
connection_properties[OPT_ENABLE_CLEARTEXT_PLUGIN]=true;

// To use SASL LDAP authentication using SCRAM-SHA-1 ...

connection_properties["userName"] = "sasl_ldap_user_name";
connection_properties["password"] = "sasl_ldap_scram_password";

// Needed if Connector/C++ was installed from tar file or Zip archive ...

connection_properties[OPT_PLUGIN_DIR] = "${INSTALL_DIR}/lib{64}/plugin";

auto *driver = get_driver_instance();
auto *con = driver->connect(connection_properties);

// Execute statements ...

con->close();

Kerberos 驗證

Kerberos 驗證使 Connector/C++ 應用程式能夠為使用 authentication_kerberos 伺服器端驗證外掛程式的帳戶建立連線,前提是正確的 Kerberos 票證可用或可以從 Kerberos 取得。此功能在執行 Linux 的用戶端主機上可用(從 8.0.26 開始)。

在 Windows 上(從 8.0.32 開始),OPT_AUTHENTICATION_KERBEROS_CLIENT_MODE 連線選項可以設定為 SSPI(預設)或 GSSAPI。此選項允許在 Windows 上為 authentication_kerberos_client 驗證外掛程式在執行時間選擇 SSPI 和 GSSAPI 之間。Connector/C++ 通過 MIT kerberos 程式庫實作 GSSAPI 模式,並且此模式與 Windows 上的 Java SE 安全性工具(例如,klistkinit 命令)相容。在此模式下,Windows 主機上的票證搜尋僅限於 MIT Kerberos 快取。如果快取中沒有票證,即使 Windows 票證有效,連線也會失敗

以前,Connector/C++ 僅通過 Windows SSPI Kerberos 程式庫支援 Kerberos 驗證(從 8.0.27 開始)。SSPI 無法取得使用 kinit 命令產生的快取憑證。在 SSPI 模式下,如果用戶端使用者未提供密碼,且驗證方法僅考慮 Windows 票證,則 Windows 單一登入票證將用於驗證。如果票證遺失或無效,即使 Kerberos 快取包含有效票證,連線也會失敗。有關更多資訊,請參閱SSPI 模式下 Windows 用戶端的命令

在下列情況下,可以連線到 Kerberos 驗證的帳戶而無需提供使用者名稱

  • 使用者已指派 Kerberos 主體名稱,存在該主體名稱的 MySQL Kerberos 帳戶,且使用者具有所需的票證。

  • 必須使用 OPT_DEFAULT_AUTH 連線選項將預設驗證方法設定為 authentication_kerberos_client 用戶端驗證外掛程式。

只要使用者在 Linux 上的 Kerberos 快取或 Windows 上的 MIT Kerberos 快取中擁有所需的票證(例如,由 kinit 或類似命令建立),就可以在不提供密碼的情況下連線。

注意

SSPI Kerberos 程式庫與 Java SE 安全性工具不相容。若要使用 kinit 命令,用戶端應用程式必須將 OPT_AUTHENTICATION_KERBEROS_CLIENT_MODE 連線選項設定為 GSSAPI

如果 Kerberos 快取(或 MIT Kerberos 快取)中不存在所需的票證,且提供了密碼,則 Connector/C++ 會使用該密碼從 Kerberos 取得票證。如果在快取中找到所需的票證,則會忽略提供的任何密碼,並且連線可能會成功即使密碼不正確。

在執行 Windows 的用戶端主機上,您可以通過設定 KRB5_CONFIG 環境變數來覆寫 MIT Kerberos 組態檔案的預設位置,並使用 KRB5CCNAME 環境變數來覆寫預設的 MIT Kerberos 憑證快取名稱(例如,KRB5CCNAME=DIR:/mydir/)。

有關使用 MIT Kerberos 組態和快取的詳細資訊,請參閱

有關 Kerberos 驗證的更多資訊,請參閱Kerberos 可插拔驗證

OCI 驗證

OCI 驗證使 Connector/C++ 應用程式能夠在沒有密碼的情況下為使用 authentication_oci 伺服器端驗證外掛程式的帳戶建立連線,前提是可使用正確的組態項目來對應到特定 Oracle Cloud Infrastructure 租用戶中的一個唯一使用者。此支援已在 Connector/C++ 8.0.27 版本中新增。

為了確保正確的帳戶對應,用戶端 Oracle Cloud Infrastructure 組態必須包含要用於驗證的 API 金鑰的指紋(fingerprint 項目)和具有 API 金鑰私密部分的 PEM 檔案的位置(key_file 項目)。這兩個項目都應在組態檔案的 [DEFAULT] 設定檔中指定。在 Connector/C++ 8.0.33 中,OPT_OCI_CLIENT_CONFIG_PROFILE 連線選項允許在組態檔案中選擇要用於驗證的設定檔。預設情況下,OPT_OCI_CLIENT_CONFIG_PROFILE 的值為 [DEFAULT] 設定檔。

除非使用 OPT_OCI_CONFIG_FILE 連線選項指定組態檔案的替代路徑,否則將使用以下預設位置

  • Linux 或 Posix 主機類型上的 ~/.oci/config

  • Windows 主機類型上的 %HOMEDRIVE%%HOMEPATH%/.oci/config

如果未將 MySQL 使用者名稱作為連線選項提供,則會替換作業系統使用者名稱。具體來說,如果用戶端存在私密金鑰和正確的 Oracle Cloud Infrastructure 組態,則可以在不提供任何選項的情況下建立連線。

為了支援 Oracle Cloud Infrastructure 臨時金鑰驗證,Connector/C++ 8.0.33(及更高版本)會從 security_token_file 項目取得權杖檔案的位置。例如

[DEFAULT]
fingerprint=59:8a:0b[...]
key_file=~/.oci/sessions/DEFAULT/oci_api_key.pem
tenancy=ocid1.tenancy.oc1.[...]
region=us-ashburn-1
security_token_file=~/.oci/sessions/DEFAULT/token

Connector/C++ 會將一個 JSON 屬性(名稱為 "token")傳送到伺服器,其值是從 security_token_file 欄位中提取的。如果設定檔中引用的目標檔案不存在,或者檔案超過指定的最大值,則 Connector/C++ 會終止動作並回傳帶有原因的例外狀況。

如果符合以下情況,Connector/C++ 會在 JSON 酬載中傳送空的 token 值:

  • 安全性 token 檔案為空。

  • 找到組態選項 security_token_file,但組態檔案中的值為空。

在所有其他情況下,Connector/C++ 會將安全性 token 檔案的內容完整地新增至 JSON 文件中。

多因素驗證

從 Connector/C++ 8.0.28 開始,應用程式可以使用多因素驗證來建立連線,因此在連線時最多可以指定三個密碼。 OPT_PASSWORD1OPT_PASSWORD2OPT_PASSWORD3 連線選項可用於指定第一個、第二個和第三個多因素驗證密碼。

OPT_PASSWORD1 是現有 OPT_PASSWORD 選項的別名;如果兩者都提供,則會忽略 OPT_PASSWORD。有關此驗證選項的更多資訊,請參閱多因素驗證

WebAuthn (FIDO) 驗證

MySQL Server 的 WebAuthn 驗證支援使用網頁瀏覽器、智慧卡、安全性金鑰和生物識別讀取器等裝置。WebAuthn 驗證同時支援 FIDO 和 FIDO2 標準。為確保使用舊版 JBDC API 的用戶端應用程式在使用者預期與 FIDO/FIDO2 裝置互動時收到通知,Connector/C++ 8.2.0 (和更新版本) 在 MySQL_Driver 類別的 setCallback() 方法中新增了一個名為 WebAuthn_Callback 的回呼引數。WebAuthn_Callback 類別有一個名為 ActionRequested() 的回呼方法。

class WebAuthn_Callback
{
public:

  WebAuthn_Callback(std::function<void(SQLString)>);

  /**
  * Override this message to receive WebAuthn Action Requests
  */
  virtual void ActionRequested(sql::SQLString msg);

};

針對使用 WebAuthn 驗證的帳戶,明確設定 WebAuthn_Callback 回呼。

注意

在 Windows 上,用戶端應用程式必須以管理員身分執行。這是 fido2.dll 程式庫的要求,該程式庫由 authentication_webauthn 外掛程式使用。

用戶端應用程式有兩個選項可以從 Connector 取得回呼:

  • 將函式或 lambda 傳遞給 WebAuthn_Callback

    driver->setCallBack(WebAuthn_Callback([](SQLString msg) {...}));
  • 實作虛擬方法 ActionRequested

    class MyWindow : public WebAuthn_Callback
    {
      void ActionRequested(sql::SQLString msg) override;
    };
    
    MyWindow window;
    driver->setCallBack(window);

設定新的回呼總是會移除先前的回呼。若要停用作用中的回呼並還原預設行為,請傳遞 nullptr 作為函式回呼。範例

driver->setCallBack(WebAuthn_Callback(nullptr));

有關 WebAuthn 驗證的更多資訊,請參閱WebAuthn 可插拔驗證

注意

Connector/C++ 8.0.29 新增了 authentication_fido 支援,在 8.2.0 中棄用此支援,轉而使用 authentication_webauthn,並在 8.4.0 中移除了 authentication_fido 支援。為了向後相容,Fido_Callback 回呼引數仍然存在,但它會調用 WebAuthn 驗證。