#### 6.4.1.9 无登录可插拔身份验证

[](<>)[](<>)

这`mysql_no_login`服务器端身份验证插件可防止所有客户端连接到使用它的任何帐户。此插件的用例包括：

-   必须能够以提升的权限执行存储的程序和视图而不将这些权限暴露给普通用户的帐户。

-   不应允许直接登录但只能通过代理帐户访问的代理帐户。

    下表显示了插件和库文件名。您的系统上的文件名后缀可能不同。该文件必须位于由[`插件目录`](server-system-variables.html#sysvar_plugin_dir)系统变量。

[](<>)

**表 6.24 无登录身份验证的插件和库名称**

| 插件或文件 | 插件或文件名 |
| ----- | ------ |
| 服务器端插件 | `mysql_no_login` |
| 客户端插件 | 没有 |
| 库文件 | `mysql_no_login.so` |

以下部分提供了特定于无登录可插入身份验证的安装和使用信息：

-   [安装 No-Login Pluggable 身份验证](no-login-pluggable-authentication.html#no-login-pluggable-authentication-installation)

-   [卸载 No-Login Pluggable 身份验证](no-login-pluggable-authentication.html#no-login-pluggable-authentication-uninstallation)

-   [使用无登录可插入身份验证](no-login-pluggable-authentication.html#no-login-pluggable-authentication-usage)

    有关 MySQL 中可插入身份验证的一般信息，请参阅[第 6.2.17 节，“可插拔身份验证”](pluggable-authentication.html).有关代理用户信息，请参阅[第 6.2.19 节，“代理用户”](proxy-users.html).

##### 安装 No-Login Pluggable 身份验证

本节介绍如何安装免登录认证插件。有关安装插件的一般信息，请参阅[第 5.6.1 节，“安装和卸载插件”](plugin-loading.html).

要被服务器使用，插件库文件必须位于 MySQL 插件目录（由[`插件目录`](server-system-variables.html#sysvar_plugin_dir)系统变量）。如有必要，通过设置值来配置插件目录位置[`插件目录`](server-system-variables.html#sysvar_plugin_dir)在服务器启动时。

插件库文件的基本名称是`mysql_no_login`.文件名后缀因平台而异（例如，`。所以`对于 Unix 和类 Unix 系统，`.dll`对于 Windows）。

要在服务器启动时加载插件，请使用[`--plugin-load-add`](server-options.html#option_mysqld_plugin-load-add)选项来命名包含它的库文件。使用这种插件加载方法，每次服务器启动时都必须给出该选项。例如，将这些行放在服务器中`我的.cnf`文件，调整`。所以`根据需要为您的平台添加后缀：

```
[mysqld]
plugin-load-add=mysql_no_login.so
```

修改后`我的.cnf`, 重启服务器使新设置生效。

或者，要在运行时加载插件，请使用此语句，调整`。所以`根据需要为您的平台添加后缀：

```
INSTALL PLUGIN mysql_no_login SONAME 'mysql_no_login.so';
```

[`安装插件`](install-plugin.html)立即加载插件，并将其注册到`mysql.plugins`系统表，以使服务器在每次后续正常启动时加载它，而无需[`--plugin-load-add`](server-options.html#option_mysqld_plugin-load-add).

要验证插件安装，请检查[`INFORMATION_SCHEMA.PLUGINS`](information-schema-plugins-table.html)表或使用[`显示插件`](show-plugins.html)声明（见[第 5.6.2 节，“获取服务器插件信息”](obtaining-plugin-information.html)）。例如：

```
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
       FROM INFORMATION_SCHEMA.PLUGINS
       WHERE PLUGIN_NAME LIKE '%login%';
+----------------+---------------+
| PLUGIN_NAME    | PLUGIN_STATUS |
+----------------+---------------+
| mysql_no_login | ACTIVE        |
+----------------+---------------+
```

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

要将 MySQL 帐户与 no-login 插件相关联，请参阅[使用无登录可插入身份验证](no-login-pluggable-authentication.html#no-login-pluggable-authentication-usage).

##### 卸载 No-Login Pluggable 身份验证

卸载免登录身份验证插件的方法取决于您的安装方式：

-   如果您在服务器启动时使用[`--plugin-load-add`](server-options.html#option_mysqld_plugin-load-add)选项，在没有选项的情况下重新启动服务器。

-   如果您在运行时使用[`安装插件`](install-plugin.html)声明，它仍然在服务器重新启动时安装。要卸载它，请使用[`卸载插件`](uninstall-plugin.html)：

    ```
    UNINSTALL PLUGIN mysql_no_login;
    ```

##### 使用无登录可插入身份验证

本节介绍如何使用 no-login 身份验证插件来防止帐户被用于从 MySQL 客户端程序连接到服务器。假设服务器在启用 no-login 插件的情况下运行，如中所述[安装 No-Login Pluggable 身份验证](no-login-pluggable-authentication.html#no-login-pluggable-authentication-installation).

参考中的免登录认证插件`标识为`a的从句[`创建用户`](create-user.html)声明，使用名称`mysql_no_login`.

使用身份验证的帐户`mysql_no_login`可以用作`定义者`用于存储的程序和视图对象。如果这样的对象定义还包括`SQL 安全定义器`，它以该帐户的权限执行。DBA 可以使用此行为来提供对仅通过良好控制的接口公开的机密或敏感数据的访问。

以下示例说明了这些原则。它定义了一个不允许客户端连接的帐户，并将一个视图与它相关联，该视图仅公开`mysql.user`系统表：

```
CREATE DATABASE nologindb;
CREATE USER 'nologin'@'localhost'
  IDENTIFIED WITH mysql_no_login;
GRANT ALL ON nologindb.*
  TO 'nologin'@'localhost';
GRANT SELECT ON mysql.user
  TO 'nologin'@'localhost';
CREATE DEFINER = 'nologin'@'localhost'
  SQL SECURITY DEFINER
  VIEW nologindb.myview
  AS SELECT User, Host FROM mysql.user;
```

要向普通用户提供对视图的受保护访问，请执行以下操作：

```
GRANT SELECT ON nologindb.myview
  TO 'ordinaryuser'@'localhost';
```

现在普通用户可以使用视图访问它呈现的有限信息：

```
SELECT * FROM nologindb.myview;
```

用户尝试访问除视图公开的列之外的列会导致错误，正如未授予访问权限的用户尝试从视图中进行选择一样。

笔记

因为`登录`帐户不能直接使用，设置它使用的对象所需的操作必须由`根`或具有创建对象和设置所需权限的类似帐户`定义者`价值观。

这`mysql_no_login`插件在代理场景中也很有用。（有关代理中涉及的概念的讨论，请参阅[第 6.2.19 节，“代理用户”](proxy-users.html).) 使用身份验证的帐户`mysql_no_login`可用作代理帐户的代理用户：

```
-- create proxied account
CREATE USER 'proxied_user'@'localhost'
  IDENTIFIED WITH mysql_no_login;
-- grant privileges to proxied account
GRANT ...
  ON ...
  TO 'proxied_user'@'localhost';
-- permit proxy_user to be a proxy account for proxied account
GRANT PROXY
  ON 'proxied_user'@'localhost'
  TO 'proxy_user'@'localhost';
```

这使客户端可以通过代理帐户访问 MySQL (`代理用户`) 但不要通过以代理用户身份直接连接来绕过代理机制 (`代理用户`）。使用连接的客户端`代理用户`帐户具有以下权限`代理用户`帐户，但是`代理用户`本身不能用来连接。

有关保护代理帐户不被直接使用的替代方法，请参阅[防止直接登录代理帐户](proxy-users.html#preventing-proxied-account-direct-login).
