#### 6.4.1.6 Windows 可插拔身份验证

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

笔记

Windows 可插拔身份验证是商业产品 MySQL 企业版中包含的扩展。要了解有关商业产品的更多信息，请参阅<https://www.mysql.com/products/>.

MySQL Enterprise Edition for Windows 支持在 Windows 上执行外部身份验证的身份验证方法，使 MySQL Server 能够使用本机 Windows 服务来验证客户端连接。登录到 Windows 的用户可以根据其环境中的信息从 MySQL 客户端程序连接到服务器，而无需指定额外的密码。

客户端和服务器在身份验证握手中交换数据包。作为此交换的结果，服务器创建了一个安全上下文对象，该对象表示 Windows 操作系统中客户端的身份。此身份包括客户帐户的名称。Windows 可插入身份验证使用客户端的身份来检查它是给定帐户还是组成员。默认情况下，协商使用 Kerberos 进行身份验证，如果 Kerberos 不可用，则使用 NTLM。

Windows 可插入身份验证提供以下功能：

-   外部身份验证：Windows 身份验证使 MySQL 服务器能够接受来自已登录到 Windows 的 MySQL 授权表之外定义的用户的连接。

-   代理用户支持：Windows 身份验证可以向 MySQL 返回一个不同于客户端程序传递的外部用户名的用户名。这意味着插件可以返回 MySQL 用户，该用户定义了外部 Windows 身份验证用户应具有的权限。例如，一个名为的 Windows 用户`乔`可以连接并拥有名为的 MySQL 用户的权限`开发商`.

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

[](<>)

**表 6.20 Windows 身份验证的插件和库名称**

| 插件或文件 | 插件或文件名 |
| ----- | ------ |
| 服务器端插件 | `身份验证_windows` |
| 客户端插件 | `authentication_windows_client` |
| 库文件 | `authentication_windows.dll` |

库文件仅包含服务器端插件。客户端插件内置于`libmysql客户端`客户端库。

服务器端 Windows 身份验证插件仅包含在 MySQL 企业版中。它不包含在 MySQL 社区发行版中。客户端插件包含在所有发行版中，包括社区发行版。这使来自任何发行版的客户端都可以连接到加载了服务器端插件的服务器。

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

-   [安装 Windows 可插入身份验证](windows-pluggable-authentication.html#windows-pluggable-authentication-installation)

-   [卸载 Windows 可插入身份验证](windows-pluggable-authentication.html#windows-pluggable-authentication-uninstallation)

-   [使用 Windows 可插入身份验证](windows-pluggable-authentication.html#windows-pluggable-authentication-usage)

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

##### 安装 Windows 可插入身份验证

本节介绍如何安装服务器端 Windows 身份验证插件。有关安装插件的一般信息，请参阅[第 5.6.1 节，“安装和卸载插件”](plugin-loading.html).

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

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

```
[mysqld]
plugin-load-add=authentication_windows.dll
```

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

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

```
INSTALL PLUGIN authentication_windows SONAME 'authentication_windows.dll';
```

[`安装插件`](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 '%windows%';
+------------------------+---------------+
| PLUGIN_NAME            | PLUGIN_STATUS |
+------------------------+---------------+
| authentication_windows | ACTIVE        |
+------------------------+---------------+
```

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

要将 MySQL 帐户与 Windows 身份验证插件相关联，请参阅[使用 Windows 可插入身份验证](windows-pluggable-authentication.html#windows-pluggable-authentication-usage).额外的插件控件由[`authentication_windows_use_principal_name`](server-system-variables.html#sysvar_authentication_windows_use_principal_name)和[`authentication_windows_log_level`](server-system-variables.html#sysvar_authentication_windows_log_level)系统变量。看[第 5.1.8 节，“服务器系统变量”](server-system-variables.html).

##### 卸载 Windows 可插入身份验证

用于卸载 Windows 身份验证插件的方法取决于您的安装方式：

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

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

    ```
    UNINSTALL PLUGIN authentication_windows;
    ```

    此外，删除任何设置 Windows 插件相关系统变量的启动选项。

##### 使用 Windows 可插入身份验证

Windows 身份验证插件支持使用 MySQL 帐户，这样登录到 Windows 的用户可以连接到 MySQL 服务器，而无需指定额外的密码。假设服务器在启用服务器端插件的情况下运行，如中所述[安装 Windows 可插入身份验证](windows-pluggable-authentication.html#windows-pluggable-authentication-installation).一旦 DBA 启用了服务器端插件并设置了帐户以使用它，客户端就可以使用这些帐户进行连接，而无需进行其他设置。

要参考 Windows 身份验证插件`标识为`a的从句[`创建用户`](create-user.html)声明，使用名称`身份验证_windows`.假设 Windows 用户`拉法尔`和`塔莎`应该允许连接到 MySQL，以及`管理员`要么`高级用户`团体。要进行设置，请创建一个名为的 MySQL 帐户`sql_admin`使用 Windows 插件进行身份验证：

```
CREATE USER sql_admin
  IDENTIFIED WITH authentication_windows
  AS 'Rafal, Tasha, Administrators, "Power Users"';
```

插件名称是`身份验证_windows`.跟在后面的字符串`作为`关键字是身份验证字符串。它指定命名的 Windows 用户`拉法尔`要么`塔莎`允许以 MySQL 用户身份向服务器进行身份验证`sql_admin`，就像任何 Windows 用户一样`管理员`要么`高级用户`团体。后一个组名包含一个空格，因此必须用双引号字符引用。

创建后`sql_admin`帐户，登录到 Windows 的用户可以尝试使用该帐户连接到服务器：

```
C:\> mysql --user=sql_admin
```

这里不需要密码。这`身份验证_windows`插件使用 Windows 安全 API 来检查正在连接的 Windows 用户。如果该用户被命名`拉法尔`要么`塔莎`，或者是`管理员`要么`高级用户`组，服务器授予访问权限，客户端通过身份验证为`sql_admin`并拥有授予该人的任何特权`sql_admin`帐户。否则，服务器拒绝访问。

Windows 身份验证插件的身份验证字符串语法遵循以下规则：

-   该字符串由一个或多个用逗号分隔的用户映射组成。

-   每个用户映射将 Windows 用户或组名与 MySQL 用户名相关联：

    ```
    win_user_or_group_name=mysql_user_name
    win_user_or_group_name
    ```

    对于后一种语法，没有*`mysql_user_name`*给定的值，隐含的值是 MySQL 用户创建的[`创建用户`](create-user.html)陈述。因此，这些语句是等价的：

    ```
    CREATE USER sql_admin
      IDENTIFIED WITH authentication_windows
      AS 'Rafal, Tasha, Administrators, "Power Users"';

    CREATE USER sql_admin
      IDENTIFIED WITH authentication_windows
      AS 'Rafal=sql_admin, Tasha=sql_admin, Administrators=sql_admin,
          "Power Users"=sql_admin';
    ```

-   每个反斜杠字符 (`\`) 中的值必须加倍，因为反斜杠是 MySQL 字符串中的转义字符。

-   不在双引号内的前导和尾随空格将被忽略。

-   未引用*`win_user_or_group_name`*和*`mysql_user_name`*values 可以包含除等号、逗号或空格之外的任何内容。

-   如果一个*`win_user_or_group_name`*和或*`mysql_user_name`*value 用双引号括起来，引号之间的所有内容都是 value 的一部分。这是必要的，例如，如果名称包含空格字符。双引号内的所有字符都是合法的，除了双引号和反斜杠。要包含任一字符，请使用反斜杠对其进行转义。

-   *`win_user_or_group_name`*值对本地或域中的 Windows 主体使用常规语法。示例（注意反斜杠的两倍）：

    ```
    domain\\user
    .\\user
    domain\\group
    .\\group
    BUILTIN\\WellKnownGroup
    ```

    当服务器调用以对客户端进行身份验证时，插件会从左到右扫描身份验证字符串以查找与 Windows 用户匹配的用户或组。如果有匹配，插件返回对应的*`mysql_user_name`*到 MySQL 服务器。如果没有匹配，认证失败。

    用户名匹配优先于组名匹配。假设 Windows 用户名为`win_user`是成员`win_group`身份验证字符串如下所示：


```
'win_group = sql_user1, win_user = sql_user2'
```

什么时候`win_user`连接到 MySQL 服务器，两者都匹配`win_group`并`win_user`.该插件将用户身份验证为`sql_user2`因为更具体的用户匹配优先于组匹配，即使组在身份验证字符串中首先列出。

Windows 身份验证始终适用于来自运行服务器的同一台计算机的连接。对于跨计算机连接，两台计算机都必须注册到 Microsoft Active Directory。如果它们在同一个 Windows 域中，则无需指定域名。也可以允许来自不同域的连接，如下例所示：

```
CREATE USER sql_accounting
  IDENTIFIED WITH authentication_windows
  AS 'SomeDomain\\Accounting';
```

这里`某域`是另一个域的名称。反斜杠字符加倍，因为它是字符串中的 MySQL 转义字符。

[](<>)

MySQL 支持代理用户的概念，客户端可以使用一个帐户连接和验证 MySQL 服务器，但在连接时拥有另一个帐户的权限（请参阅[第 6.2.19 节，“代理用户”](proxy-users.html)）。假设您希望 Windows 用户使用单个用户名进行连接，但根据他们的 Windows 用户名和组名映射到特定的 MySQL 帐户，如下所示：

-   这`本地用户`和`我的域\域_用户`本地和域 Windows 用户应映射到`local_wlad`MySQL 帐户。

-   用户在`我的域\开发人员`域组应映射到`local_dev`MySQL 帐户。

-   本地机器管理员应该映射到`本地管理员`MySQL 帐户。

    要进行此设置，请为要连接的 Windows 用户创建一个代理帐户，并配置此帐户，以便用户和组映射到适当的 MySQL 帐户（`local_wlad`,`local_dev`,`本地管理员`）。此外，授予 MySQL 帐户适合他们需要执行的操作的权限。以下说明使用`win_proxy`作为代理账户，以及`local_wlad`,`local_dev`， 和`本地管理员`作为代理帐户。

1.  创建代理 MySQL 帐户：

    ```
    CREATE USER win_proxy
      IDENTIFIED WITH  authentication_windows
      AS 'local_user = local_wlad,
          MyDomain\\domain_user = local_wlad,
          MyDomain\\Developers = local_dev,
          BUILTIN\\Administrators = local_admin';
    ```

2.  要使代理生效，代理帐户必须存在，因此请创建它们：

    ```
    CREATE USER local_wlad
      IDENTIFIED WITH mysql_no_login;
    CREATE USER local_dev
      IDENTIFIED WITH mysql_no_login;
    CREATE USER local_admin
      IDENTIFIED WITH mysql_no_login;
    ```

    代理帐户使用`mysql\u无\u登录`身份验证插件，防止客户端使用帐户直接登录MySQL服务器。相反，使用Windows进行身份验证的用户应该使用`赢得代理权`代理账户。（假设插件已安装。有关说明，请参阅[第6.4.1.9节，“无登录可插拔身份验证”](no-login-pluggable-authentication.html)）有关保护代理帐户不被直接使用的替代方法，请参阅[阻止直接登录代理帐户](proxy-users.html#preventing-proxied-account-direct-login).

    你也应该执行[`授予`](grant.html)语句（未显示），授予每个代理帐户MySQL访问所需的权限。

3.  向代理帐户授予[`代理`](privileges-provided.html#priv_proxy)每个代理帐户的权限：

    ```
    GRANT PROXY ON local_wlad TO win_proxy;
    GRANT PROXY ON local_dev TO win_proxy;
    GRANT PROXY ON local_admin TO win_proxy;
    ```

    现在Windows用户`本地用户`和`MyDomain\domain\u用户`可以通过以下方式连接到MySQL服务器：`赢得代理权`并且在经过身份验证后，拥有身份验证字符串中给定的帐户权限（在本例中，`本地的`).中的用户`MyDomain\Developers`连接为`赢得代理权`拥有`本地开发`账户中的用户`内置\管理员`组具有`本地行政`账户

    要配置身份验证，以便所有没有自己的MySQL帐户的Windows用户都通过代理帐户，请替换默认代理帐户(`''@''`)因为`赢得代理权`在前面的说明中。有关默认代理帐户的信息，请参阅[第6.2.19节“代理用户”](proxy-users.html).

笔记

如果你的MySQL安装有匿名用户，他们可能会与默认的代理用户冲突。有关此问题及其处理方法的更多信息，请参阅[默认代理用户和匿名用户冲突](proxy-users.html#proxy-users-conflicts).

要在Connector/NET 8.0及更高版本中将Windows身份验证插件与Connector/NET连接字符串一起使用，请参阅[连接器/网络身份验证](https://dev.mysql.com/doc/connector-net/en/connector-net-authentication.html).
