延伸 MySQL 8.4  /  ...  /  編寫密碼驗證外掛程式

4.4.10 編寫密碼驗證外掛程式

本節說明如何編寫伺服器端密碼驗證外掛程式。這些說明基於 MySQL 原始發行版的 plugin/password_validation 目錄中的原始碼。該目錄中的 validate_password.cc 原始檔實作名為 validate_password 的外掛程式。

注意

較舊 MySQL 版本中的 validate_password 外掛程式形式已棄用,並可能會在未來版本的 MySQL 中移除。請改用元件;請參閱轉換至密碼驗證元件

若要編寫密碼驗證外掛程式,請在外掛程式原始檔中包含下列標頭檔。根據外掛程式的功能和需求,可能也需要其他 MySQL 或一般標頭檔。

#include <mysql/plugin_validate_password.h>

plugin_validate_password.h 包含 plugin.h,因此您不需要明確包含後者檔案。plugin.h 定義了 MYSQL_VALIDATE_PASSWORD_PLUGIN 伺服器外掛程式類型,以及宣告外掛程式所需的資料結構。plugin_validate_password.h 定義了特定於密碼驗證外掛程式的資料結構。

密碼驗證外掛程式,如任何 MySQL 伺服器外掛程式,都有一個一般外掛程式描述符(請參閱第 4.4.2.1 節「伺服器外掛程式庫與外掛程式描述符」)。在 validate_password.cc 中,validate_password 的一般描述符如下所示

mysql_declare_plugin(validate_password)
{
  MYSQL_VALIDATE_PASSWORD_PLUGIN,     /*   type                            */
  &validate_password_descriptor,      /*   descriptor                      */
  "validate_password",                /*   name                            */
  "Oracle Corporation",               /*   author                          */
  "check password strength",          /*   description                     */
  PLUGIN_LICENSE_GPL,
  validate_password_init,             /*   init function (when loaded)     */
  validate_password_deinit,           /*   deinit function (when unloaded) */
  0x0100,                             /*   version                         */
  NULL,
  validate_password_system_variables, /*   system variables                */
  NULL,
  0,
}
mysql_declare_plugin_end;

name 成員 (validate_password) 指示在 INSTALL PLUGINUNINSTALL PLUGIN 等語句中,用於參考外掛程式的名稱。這也是 INFORMATION_SCHEMA.PLUGINSSHOW PLUGINS 所顯示的名稱。

一般描述符也會參考 validate_password_system_variables,這是一個向 SHOW VARIABLES 語句公開數個系統變數的結構

static struct st_mysql_sys_var* validate_password_system_variables[]= {
  MYSQL_SYSVAR(length),
  MYSQL_SYSVAR(number_count),
  MYSQL_SYSVAR(mixed_case_count),
  MYSQL_SYSVAR(special_char_count),
  MYSQL_SYSVAR(policy),
  MYSQL_SYSVAR(dictionary_file),
  NULL
};

validate_password_init 初始化函式會讀取字典檔(如果已指定),而 validate_password_deinit 函式會釋放與該檔案相關聯的資料結構。

一般描述符中的 validate_password_descriptor 值指向類型專屬的描述符。對於密碼驗證外掛程式,此描述符具有下列結構

struct st_mysql_validate_password
{
  int interface_version;
  /*
    This function returns TRUE for passwords which satisfy the password
    policy (as chosen by plugin variable) and FALSE for all other
    password
  */
  int (*validate_password)(mysql_string_handle password);
  /*
    This function returns the password strength (0-100) depending
    upon the policies
  */
  int (*get_password_strength)(mysql_string_handle password);
};

類型專屬的描述符具有這些成員

  • interface_version:依照慣例,類型專屬的外掛程式描述符會以給定外掛程式類型的介面版本開頭。伺服器會在載入外掛程式時檢查 interface_version,以判斷外掛程式是否與其相容。對於密碼驗證外掛程式,interface_version 成員的值為 MYSQL_VALIDATE_PASSWORD_INTERFACE_VERSION(定義於 plugin_validate_password.h 中)。

  • validate_password:伺服器呼叫以測試密碼是否符合目前密碼原則的函式。如果密碼沒問題,則傳回 1,否則傳回 0。引數是以 mysql_string_handle 值傳遞的密碼。此資料類型由 mysql_string 伺服器服務實作。如需詳細資訊,請參閱 sql 目錄中的 string_service.hstring_service.cc 原始檔。

  • get_password_strength:伺服器呼叫以評估密碼強度的函式。它傳回從 0(弱)到 100(強)的值。引數是以 mysql_string_handle 值傳遞的密碼。

對於 validate_password 外掛程式,類型專屬的描述符如下所示

static struct st_mysql_validate_password validate_password_descriptor=
{
  MYSQL_VALIDATE_PASSWORD_INTERFACE_VERSION,
  validate_password,                         /* validate function          */
  get_password_strength                      /* validate strength function */
};

若要編譯和安裝外掛程式庫檔案,請使用第 4.4.3 節「編譯與安裝外掛程式庫」中的說明。若要讓程式庫檔案可供使用,請將它安裝在 plugin 目錄中(由 plugin_dir 系統變數命名的目錄)。對於 validate_password 外掛程式,當您從原始碼建置 MySQL 時,它會被編譯和安裝。它也包含在二進位發行版中。建置程序會產生一個共享物件程式庫,其名稱為 validate_password.so.so 後綴可能會因您的平台而異)。

若要在執行階段註冊外掛程式,請使用此語句,並根據您的平台調整 .so 後綴(如有必要)

INSTALL PLUGIN validate_password SONAME 'validate_password.so';

如需外掛程式載入的其他資訊,請參閱安裝和解除安裝外掛程式

若要驗證外掛程式安裝,請檢查 INFORMATION_SCHEMA.PLUGINS 表格,或使用 SHOW PLUGINS 語句。請參閱取得伺服器外掛程式資訊

在安裝 validate_password 外掛程式時,它會公開指示密碼檢查參數的系統變數

mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password_dictionary_file    |        |
| validate_password_length             | 8      |
| validate_password_mixed_case_count   | 1      |
| validate_password_number_count       | 1      |
| validate_password_policy             | MEDIUM |
| validate_password_special_char_count | 1      |
+--------------------------------------+--------+

如需這些變數的說明,請參閱密碼驗證選項和變數

若要在測試後停用外掛程式,請使用此語句來卸載它

UNINSTALL PLUGIN validate_password;