本節說明如何撰寫伺服器端密碼驗證外掛程式。說明基於 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 PLUGIN
或 UNINSTALL PLUGIN
等陳述式中用於參考外掛程式的名稱。這也是 INFORMATION_SCHEMA.PLUGINS
或 SHOW 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.h
和string_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;