• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 编写密码验证插件

    本节介绍如何编写服务器端密码验证插件。这些说明基于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.hinclude plugin.h,因此您无需显式包括后者。plugin.h定义MYSQL_VALIDATE_PASSWORD_PLUGIN服务器插件类型和声明插件所需的数据结构。plugin_validate_password.h定义特定于密码验证插件的数据结构。

    与任何MySQL服务器插件一样,密码验证插件也具有通用的插件描述符(请参见“服务器插件库和插件描述符”)。在中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.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服务器服务实现。有关详细信息,请参见目录中的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 */
    };
    

    要编译和安装插件库文件,请使用“编译和安装插件库”中的说明。要使该库文件可供使用,请将其安装在插件目录(由plugin_dir系统变量命名的目录)中。对于该validate_password插件,当您从源代码构建MySQL时,将对其进行编译和安装。它也包含在二进制发行版中。构建过程将生成一个共享对象库,其名称为validate_password.so.so后缀可能因平台而异)。

    要在运行时注册插件,请使用以下语句(.so根据需要调整平台的后缀):

    INSTALL PLUGIN validate_password SONAME 'validate_password.so';
    

    有关插件加载的更多信息,请参见“MySQL服务器插件”。

    要验证插件安装,请检查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;