本节介绍如何编写服务器端密码验证插件。这些说明基于 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;