10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 本手册下载
PDF (Ltr)- 41.9 mb
PDF (A4)- 42.0 mb
手册页(TGZ)- 266.1 kb
手册页(邮政编码)- 376.0 kb
信息(Gzip)- 4.0 mb
信息(邮政编码)- 4.0 mb
本手册节选

6.2.17可插入身份验证

当客户端连接到MySQL服务器时,服务器使用客户端提供的用户名和客户端主机从mysql.user系统表。然后,服务器验证客户端,从帐户行确定哪个验证插件应用到客户端:

  • 如果服务器无法找到该插件,则会发生错误并拒绝连接尝试。

  • 否则,服务器调用该插件对用户进行身份验证,插件向服务器返回一个状态,指示用户是否提供了正确的密码并允许连接。

可插入身份验证支持以下重要功能:

  • 认证方法的选择。可插入身份验证使得dba可以很容易地选择和更改用于单个MySQL帐户的身份验证方法。

  • 外部认证。可插入身份验证使客户机可以使用与身份验证方法相适应的凭据连接到MySQL服务器mysql.user系统表。例如,可以创建插件来使用外部身份验证方法,如PAM、Windows登录id、LDAP或Kerberos。

  • 代理用户:如果一个用户被允许连接,认证插件可以向服务器返回一个不同于连接用户名的用户名,以表明连接用户是另一个用户(代理用户)的代理。在连接持续期间,出于访问控制的目的,代理用户被视为拥有代理用户的特权。实际上,一个用户模拟另一个用户。有关更多信息,请参见第6.2.19节“代理用户”

请注意

方法启动服务器——skip-grant-tables选项,即使加载了,也不会使用身份验证插件,因为服务器不执行客户机身份验证,并允许任何客户机连接。因为这是不安全的,如果服务器是用——skip-grant-tables选项,它还通过启用禁用远程连接skip_networking

提供身份验证插件

MySQL 8.0提供了以下认证插件:

请注意

有关当前使用可插入身份验证的限制,包括哪些连接器支持哪些插件的信息,请参见可插入身份验证的限制

第三方连接器开发人员应该阅读这一节,以确定连接器可以在多大程度上利用可插入身份验证功能,以及采取哪些步骤来提高兼容性。

如果您有兴趣编写自己的身份验证插件,请参见写作身份验证插件

默认的认证插件

创建用户而且改变用户语句具有指定帐户身份验证方式的语法。这种语法的某些形式不显式地命名身份验证插件(没有认同条款)。例如:

创建用户jeffrey @ localhost密码”;

在这种情况下,服务器为帐户分配默认的身份验证插件。在MySQL 8.0.27之前,这个默认值是default_authentication_plugin系统变量。

从MySQL 8.0.27开始,它引入了多因素身份验证,最多可以有三个子句来指定帐户的身份验证方式。为名称为no plugin的身份验证方法确定默认身份验证插件的规则是特定于因素的:

  • 因素1:如果authentication_policy元素1命名了一个认证插件,该插件是默认的。如果authentication_policy元素1的价值。default_authentication_plugin是默认的。

    给定上面的规则,下面的语句创建一个双因素身份验证帐户,其中第一个因素身份验证方法由authentication_policydefault_authentication_plugin设置:

    CREATE USER 'wei'@'localhost' IDENTIFIED BY '密码' AND IDENTIFIED WITH authentication_ldap_simple;

    以同样的方式,这个示例创建了一个三因素身份验证帐户:

    CREATE USER 'mateo'@'localhost' IDENTIFIED BY '密码' AND IDENTIFIED WITH authentication_ldap_simple AND IDENTIFIED WITH authentication_fido;

    您可以使用显示创建用户查询应用的认证方式。

  • 因素2或3:如果对应authentication_policy元素命名一个认证插件,该插件是默认的。如果authentication_policy元素是或空,无默认;试图为因子定义帐户身份验证方法而不命名插件是错误的,如下例所示:

    mysql> CREATE USER 'sofia'@'localhost' IDENTIFIED WITH ' authentication_ldap_simple ' AND IDENTIFIED BY 'abc';mysql> CREATE USER 'sofia'@'localhost' IDENTIFIED WITH authentication_ldap_simple AND IDENTIFIED BY 'abc';错误1524 (HY000):插件“*”没有加载

身份验证插件的使用

本节提供安装和使用身份验证插件的一般说明。关于特定插件的说明,请参阅下面描述该插件的章节第6.4.1节“认证插件”

一般来说,可插入身份验证在服务器端和客户端使用一对对应的插件,所以你使用一个给定的身份验证方法如下:

  • 如果需要,安装插件库或包含适当插件的库。在服务器主机上,安装包含服务器端插件的库,以便服务器可以使用它来验证客户机连接。类似地,在每个客户端主机上安装包含客户端插件的库,以供客户端程序使用。不需要安装内置的身份验证插件。

  • 对于您创建的每个MySQL帐户,指定用于身份验证的适当的服务器端插件。如果帐户要使用默认的身份验证插件,帐户创建语句不需要显式指定插件。服务器分配默认的身份验证插件,确定如默认的认证插件

  • 当客户端连接时,服务器端插件告诉客户端程序使用哪个客户端插件进行身份验证。

在帐户使用服务器和客户端程序默认的身份验证方法的情况下,服务器不需要与客户端通信要使用哪个客户端插件,并且可以避免客户端/服务器协商中的往返。

对于标准的MySQL客户端,例如mysql而且mysqladmin,——default-auth =plugin_nameOption可以在命令行上指定,作为程序预期使用哪个客户端插件的提示,不过,如果与用户帐户相关联的服务器端插件需要不同的客户端插件,则服务器将重写该选项。

如果客户端程序找不到客户端插件库文件,则指定一个——plugin-dir =dir_name选项指示插件库目录位置。

认证插件客户端/服务器兼容性

可插入身份验证为MySQL帐户选择身份验证方法提供了灵活性,但在某些情况下,由于客户端和服务器之间的身份验证插件不兼容,客户端连接无法建立。

要使客户端成功连接到给定服务器上的给定帐户,一般的兼容性原则是客户端和服务器都必须支持身份验证方法账号要求。因为身份验证方法是通过身份验证插件实现的,所以客户机和服务器都必须支持身份验证插件账号要求。

身份验证插件不兼容可能以各种方式出现。例子:

  • 使用5.7.22或更低版本的MySQL 5.7客户端连接到MySQL 8.0服务器帐户进行身份验证caching_sha2_password.这失败了,因为5.7客户机不识别MySQL 8.0中引入的插件。(这个问题在5.7.23的MySQL 5.7中被解决,当caching_sha2_password客户端支持被添加到MySQL客户端库和客户端程序中。)

  • 使用MySQL 5.7客户端连接到5.7以前版本的服务器帐户进行身份验证mysql_old_password.这种方法失败的原因有很多。首先,这种连接需要——secure-auth = 0,这不再是一个受支持的选项。即使支持它,5.7客户端也不识别这个插件,因为它在MySQL 5.7中被删除了。

  • 使用从社区发行版的MySQL 5.7客户端连接到使用企业专用LDAP身份验证插件进行身份验证的MySQL 5.7企业服务器帐户。这失败了,因为Community客户端不能访问Enterprise插件。

一般来说,当来自同一个MySQL发行版的客户端和服务器之间建立连接时,不会出现这些兼容性问题。当在来自不同MySQL系列的客户机和服务器之间建立连接时,可能会出现问题。当MySQL引入新的认证插件或删除旧的认证插件时,这些问题在开发过程中是固有的。为了将潜在的不兼容性降至最低,应定期及时升级服务器、客户端和连接器。

认证插件连接器写入注意事项

MySQL客户端/服务器协议的实现多种多样。的libmysqlclientC API客户端库是一个实现。一些MySQL连接器(通常不是用C编写的)提供它们自己的实现。然而,并不是所有的协议实现都以相同的方式处理插件身份验证。本节描述协议实现者应该考虑的身份验证问题。

在客户端/服务器协议中,服务器会告诉连接的客户端它认为哪个身份验证插件是默认的。如果客户端使用的协议实现试图加载默认插件,而该插件在客户端不存在,加载操作将失败。如果默认插件不是客户端试图连接的帐户实际需要的插件,这是一个不必要的失败。

如果客户端/服务器协议实现没有自己的默认身份验证插件概念,并且总是试图加载由服务器指定的默认插件,那么如果该插件不可用,则会失败并报错。

为了避免这个问题,客户端使用的协议实现应该有自己的默认插件,并且应该将其作为首选(或者,在加载服务器指定的默认插件失败的情况下,退回到这个默认)。例子:

  • 在MySQL 5.7中,libmysqlclient使用作为其默认选择mysql_native_password或通过MYSQL_DEFAULT_AUTH选择mysql_options ()

  • 当5.7客户端试图连接到8.0服务器时,服务器指定caching_sha2_password作为其默认的身份验证插件,但客户端仍然发送凭证详细信息mysql_native_password或者任何指定的东西MYSQL_DEFAULT_AUTH

  • 客户端加载由服务器指定的插件的唯一时间是更改插件请求,但在这种情况下,它可以是任何插件,这取决于用户帐户。在这种情况下,客户端必须尝试加载插件,如果该插件不可用,则错误是不可选的。

可插入身份验证的限制

本节的第一部分描述了对可插入身份验证框架适用性的一般限制第6.2.17节,“可插入认证”.第二部分描述了第三方连接器开发人员如何确定连接器可以在多大程度上利用可插入身份验证功能,以及采取哪些步骤来提高兼容性。

这个词本地身份验证对象中存储的密码进行身份验证mysql.user系统表。在实现可插入身份验证之前,这与旧的MySQL服务器提供的身份验证方法相同。Windows本地身份验证指使用已登录Windows的用户的凭证进行身份验证,由Windows本地身份验证插件(窗口插件短)。

通用可插式身份验证限制
  • 连接器/ c++:使用此连接器的客户机只能通过使用本机身份验证的帐户连接到服务器。

    例外:如果连接器被构建为链接到,则支持可插入身份验证libmysqlclient动态地(而不是静态地)加载当前版本的libmysqlclient如果安装了该版本,或者连接器根据当前从源代码重新编译到链接libmysqlclient

    有关编写连接器以处理来自服务器的关于默认服务器端身份验证插件的信息的信息,请参见认证插件连接器写入注意事项

  • 连接器/网:使用Connector/NET的客户机可以通过使用本机身份验证或Windows本机身份验证的帐户连接到服务器。

  • 连接器/ PHP:使用此连接器的客户机只能通过使用本机身份验证的帐户连接到服务器,当使用PHP的MySQL本机驱动程序编译时(mysqlnd).

  • Windows本地身份验证:通过使用Windows插件的帐户连接需要Windows域设置。如果没有它,则使用NTLM身份验证,然后只能进行本地连接;也就是说,客户端和服务器必须运行在同一台计算机上。

  • 代理用户:代理用户支持的范围是,客户端可以通过通过实现代理用户功能的插件(即可以返回与连接用户不同的用户名的插件)进行认证的帐户进行连接。例如,PAM和Windows插件支持代理用户。的mysql_native_password而且sha256_password认证插件默认情况下不支持代理用户,但可以配置为这样做;看到代理用户映射的服务器支持

  • 复制:副本不仅可以使用本机身份验证使用复制用户帐户,还可以通过使用非本机身份验证的复制用户帐户进行连接(如果所需的客户端插件可用)。如果插件内建libmysqlclient,默认可用。否则,插件必须安装在副本端以副本命名的目录中plugin_dir系统变量。

  • 联邦表:一个联邦表只能通过使用本机身份验证的远程服务器上的帐户访问远端表。

可插入身份验证和第三方连接器

第三方连接器开发人员可以使用以下指导方针来确定连接器是否准备好利用可插入身份验证功能,以及采取哪些步骤来变得更加兼容:

  • 未做任何更改的现有连接器使用本机身份验证,并且使用该连接器的客户机只能通过使用本机身份验证的帐户连接到服务器。但是,您应该根据服务器的最新版本测试连接器,以验证这样的连接仍然可以正常工作。

    例外:如果连接到,连接器可能使用可插入身份验证,而不需要进行任何更改libmysqlclient动态地(而不是静态地)加载当前版本的libmysqlclient如果安装了该版本。

  • 要利用可插入的身份验证功能,需要一个连接器libmysqlclient的当前版本应该重新链接libmysqlclient.这使连接器能够通过需要现在内建的客户端插件的帐户支持连接libmysqlclient(例如PAM身份验证所需的明文插件和Windows本机身份验证所需的Windows插件)。用电流连接libmysqlclient也使连接器能够访问安装在默认MySQL插件目录中的客户端插件(通常是由本地服务器的默认值命名的目录)plugin_dir系统变量)。

    如果连接器链接到libmysqlclient动态地,它必须确保更新的版本libmysqlclient安装在客户端主机上,并且连接器在运行时加载它。

  • 连接器支持给定身份验证方法的另一种方法是直接在客户机/服务器协议中实现它。Connector/NET使用这种方法提供对Windows本机身份验证的支持。

  • 如果连接器应该能够从不同于默认插件目录的目录加载客户端插件,那么它必须为客户端用户实现一些指定目录的方法。可能的做法包括使用命令行选项或环境变量,连接器可以从中获取目录名。标准的MySQL客户端程序,如mysql而且mysqladmin实现一个——plugin-dir选择。另请参阅C API客户端插件接口

  • 如本节前面所述,连接器对代理用户的支持取决于它所支持的身份验证方法是否允许代理用户。