扩展 MySQL 8.0  / 第 4 章 MySQL 插件 API  / 4.4 编写插件  / 4.4.9 编写认证插件  /  6.4.1.8 Socket Peer-Credential 可插入认证

6.4.1.8 Socket Peer-Credential 可插入认证

服务器端auth_socket身份验证插件对通过 Unix 套接字文件从本地主机连接的客户端进行身份验证。该插件使用 SO_PEERCRED套接字选项获取有关运行客户端程序的用户的信息。因此,该插件只能在支持该 SO_PEERCRED选项的系统上使用,例如 Linux。

这个插件的源代码可以作为一个相对简单的示例来检查,该示例演示了如何编写可加载的身份验证插件。

下表显示了插件和库文件名。该文件必须位于 plugin_dir系统变量命名的目录中。

表 6.14 套接字对等凭据身份验证的插件和库名称

插件或文件 插件或文件名
服务器端插件 auth_socket
客户端插件 无,见讨论
库文件 auth_socket.so

以下部分提供特定于套接字可插入身份验证的安装和使用信息:

有关 MySQL 中可插入身份验证的一般信息,请参阅第 6.2.11 节,“可插入身份验证”

安装套接字可插入身份验证

本节介绍如何安装套接字身份验证插件。有关安装插件的一般信息,请参阅第 5.5.1 节,“安装和卸载插件”

为了被服务器使用,插件库文件必须位于MySQL插件目录(由plugin_dir系统变量命名的目录)中。plugin_dir如有必要,通过在服务器启动时 设置值来配置插件目录位置 。

要在服务器启动时加载插件,请使用 --plugin-load-add选项命名包含它的库文件。使用这种插件加载方法,每次服务器启动时都必须给出该选项。例如,将这些行放在服务器 my.cnf文件中:

[mysqld]
plugin-load-add=auth_socket.so

修改my.cnf后重启服务器使新设置生效。

或者,要在运行时加载插件,请使用以下语句:

INSTALL PLUGIN auth_socket SONAME 'auth_socket.so';

INSTALL PLUGIN立即加载插件,并将其注册在 mysql.plugins系统表中,使服务器在后续每次正常启动时加载它,而无需--plugin-load-add.

要验证插件安装,请检查 INFORMATION_SCHEMA.PLUGINS表格或使用SHOW PLUGINS 语句(请参阅 第 5.5.2 节,“获取服务器插件信息”)。例如:

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
       FROM INFORMATION_SCHEMA.PLUGINS
       WHERE PLUGIN_NAME LIKE '%socket%';
+-------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+-------------+---------------+
| auth_socket | ACTIVE        |
+-------------+---------------+

如果插件无法初始化,请检查服务器错误日志以获取诊断消息。

要将 MySQL 帐户与套接字插件相关联,请参阅 使用套接字可插入身份验证

卸载套接字可插入身份验证

用于卸载套接字身份验证插件的方法取决于您如何安装它:

  • 如果您在服务器启动时使用 --plugin-load-add选项安装了插件,请在不使用该选项的情况下重新启动服务器。

  • 如果您在运行时使用 INSTALL PLUGIN语句安装插件,它会在服务器重新启动后保持安装状态。要卸载它,请使用UNINSTALL PLUGIN

    UNINSTALL PLUGIN auth_socket;
使用套接字可插入身份验证

socket插件检查socket用户名(操作系统用户名)是否与客户端程序指定给服务器的MySQL用户名匹配,只有匹配才允许连接。

valerie假设为一个名为who 的操作系统用户创建了一个 MySQL 帐户,auth_socket插件将通过套接字文件对来自本地主机的连接进行身份验证:

CREATE USER 'valerie'@'localhost' IDENTIFIED WITH auth_socket;

如果本地主机上登录名为 的用户 stefanie调用带有通过套接字文件进行连接 的选项的mysql ,则服务器将用于对客户端进行身份验证。插件确定选项值 ( ) 与客户端用户名 ( ) 不同,并拒绝连接。如果名为的用户尝试相同的操作,插件会发现用户名和 MySQL 用户名都相同,并允许连接。但是,即使连接是使用不同的协议(例如 TCP/IP)建立 的,插件也会拒绝连接。--user=valerieauth_socket--uservaleriestephanievalerievalerievalerie