扩展 MySQL 8.0  / 第 4 章 MySQL 插件 API  / 4.4 编写插件  /  4.4.10 编写密码验证插件

4.4.10 编写密码验证插件

本节介绍如何编写服务器端密码验证插件。这些说明基于 plugin/password_validationMySQL 源代码分发目录中的源代码。该 validate_password.cc目录中的源文件实现了名为 validate_password.

笔记

在 MySQL 8.0.4 中,validate_password 插件被重新实现为 validate_password组件。的插件形式validate_password仍然可用,但现在已弃用,并将在未来版本的 MySQL 中删除。使用该插件的 MySQL 安装应该改为使用该组件。请参阅 过渡到密码验证组件

要编写密码验证插件,请在插件源文件中包含以下头文件。根据插件功能和要求,可能还需要其他 MySQL 或通用头文件。

#include <mysql/plugin_validate_password.h>

plugin_validate_password.hincludes 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成员 ( ) 表示在or validate_password等​​语句中用于引用插件的 名称。这也是 或 显示的名称。 INSTALL PLUGINUNINSTALL PLUGININFORMATION_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服务器服务实现。有关详细信息,请参阅目录中的文件string_service.hstring_service.cc源文件 sql

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