擴充 MySQL 9.0  /  ...  /  撰寫密碼驗證外掛程式

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_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;