2.5.3 认证支持

对于使用遗留 JDBC API 建立的与服务器的连接(即,不是使用 X DevAPI 或 X DevAPI for C 建立的),Connector/C++ 支持不同的客户端身份验证插件和身份验证方法:

LDAP 身份验证

LDAP 身份验证使 Connector/C++(8.0.22 及更高版本)应用程序可以使用简单的 LDAP 身份验证或使用 SCRAM-SHA-1 身份验证方法的 SASL LDAP 身份验证连接到 MySQL 服务器。LDAP 身份验证需要使用来自 MySQL Enterprise Edition 发行版的服务器。有关 LDAP 身份验证插件的更多信息,请参阅 LDAP 可插入身份验证

连接器/C++ 二进制发行版包括提供客户端 LDAP 身份验证插件的库,以及插件所需的任何依赖库。

笔记

mysql-client-plugins在 Connector/C++ 8.0.23 中,删除了对包 的依赖 。现在仅在连接器/C++ 应用程序使用具有 LDAP 身份验证的商业 MySQL 服务器帐户建立连接的主机上才需要此软件包。在这种情况下,还必须安装额外的库: cyrus-sasl-scram用于使用 RPM 包 libsasl2-modules-gssapi-mit的安装和用于使用 Debian 包的安装。这些 SASL 包提供了对 LDAP 使用 SCRAM-SHA-256 和 GSSAPI/Kerberos 身份验证方法所需的支持。

如果 Connector/C++ 是从压缩的tar 文件或 Zip 存档安装的,应用程序将需要将OPT_PLUGIN_DIR连接选项设置为适当的目录,以便可以找到捆绑的插件库。(或者,将所需的插件库复制到客户端库期望的默认目录。)

例如:

sql::ConnectOptionsMap connection_properties;
// To use simple LDAP authentication ...
connection_properties["userName"] = "simple_ldap_user_name";
connection_properties["password"] = "simple_ldap_password";
connection_properties[OPT_ENABLE_CLEARTEXT_PLUGIN]=true;
// To use SASL LDAP authentication using SCRAM-SHA-1 ...
connection_properties["userName"] = "sasl_ldap_user_name";
connection_properties["password"] = "sasl_ldap_scram_password";
// Needed if Connector/C++ was installed from tar file or Zip archive ...
connection_properties[OPT_PLUGIN_DIR] = "${INSTALL_DIR}/lib{64}/plugin";
auto *driver = get_driver_instance();
auto *con = driver->connect(connection_properties);
// Execute statements ...
con->close();

Kerberos 认证

Kerberos 身份验证使连接器/C++ 应用程序能够为使用服务器端身份验证插件的帐户建立连接 authentication_kerberos,前提是正确的 Kerberos 票证可用或可以从 Kerberos 获得。此功能在运行 Linux(从 8.0.26 开始)和 Windows(从 8.0.27 开始)的客户端主机上可用。

在这些情况下,无需提供用户名即可连接到 Kerberos 身份验证的帐户:

  • 用户已分配 Kerberos 主体名称,存在该主体名称的 MySQL Kerberos 帐户,并且用户具有所需的票证。

  • 必须 使用连接选项 将默认身份验证方法设置为authentication_kerberos_client 客户端身份验证插件 。OPT_DEFAULT_AUTH

如果用户在 Kerberos 缓存中有所需的票据(例如,由kinit或类似命令创建),则无需提供密码即可连接。

如果 Kerberos 缓存中不存在所需的票证并且提供了密码,Connector/C++ 会使用该密码从 Kerberos 获取票证。如果在缓存中找到所需的票证,则忽略任何给定的密码,即使密码不正确,连接也可能成功。

有关 Kerberos 身份验证的更多信息,请参阅 Kerberos 可插入身份验证

OCI认证

OCI 身份验证使连接器/C++ 应用程序能够在没有密码的情况下为使用 authentication_oci服务器端身份验证插件的帐户建立连接,前提是正确的配置条目可用于映射到特定 Oracle Cloud Infrastructure 租户中的一个唯一用户。此支持是在 Connector/C++ 8.0.27 版本中添加的。

为确保正确的帐户映射,客户端 Oracle Cloud Infrastructure 配置必须包含用于身份验证的 API 密钥指纹(fingerprint条目)和具有 API 密钥私有部分的 PEM 文件的位置(key_file条目)。这两个条目都应在[DEFAULT]配置文件的配置文件中指定。

除非使用连接选项指定了配置文件的替代路径,否则将OPT_OCI_CONFIG_FILE 使用以下默认位置:

  • ~/.oci/config在 Linux 或 Posix 主机类型上

  • %HOMEDRIVE%%HOMEPATH%/.oci/config在 Windows 主机类型上

如果未提供 MySQL 用户名作为连接选项,则将替换为操作系统用户名。具体来说,如果客户端存在私钥和正确的 Oracle Cloud Infrastructure 配置,则无需提供任何选项即可建立连接。

多重身份验证

从 Connector/C++ 8.0.28 开始,应用程序可以使用多因素身份验证建立连接,这样在连接时最多可以指定三个密码。、 OPT_PASSWORD1和 连接选项可用于分别指定第一个、第二个和第三个多重身份验证密码 OPT_PASSWORD2OPT_PASSWORD3

OPT_PASSWORD1是现有 OPT_PASSWORD选项的别名;如果两者都提供, OPT_PASSWORD则被忽略。有关此身份验证选项的更多信息,请参阅 多因素身份验证

FIDO认证

使用智能卡、安全密钥和生物识别读取器等设备对 MySQL 服务器进行 FIDO 身份验证。此身份验证方法基于快速身份在线 (FIDO) 标准。为确保使用遗留 JBDC API 的客户端应用程序在用户预期与 FIDO 设备交互时得到通知,Connector/C++ 8.0.29(及更高版本) setCallback()在类中实现了一个新方法,该方法 MySQL_Driver接受名为Fido_Callback.

class Fido_Callback
{
public:
  Fido_Callback(std::function<void(SQLString)>);
  /**
  * Override this message to receive Fido Action Requests
  */
  virtual void FidoActionRequested(sql::SQLString msg);
};

如果需要,驱动程序创建的任何连接都可以使用回调。但是,如果应用程序未明确设置回调,libmysqlclient则默认确定行为,这涉及将消息打印到标准输出。

笔记

在 Windows 上,客户端应用程序必须以管理员身份运行。这是插件 fido2.dll 使用的库 的要求。authentication_fido

客户端应用程序有两个选项可用于从连接器获取回调:

  • 通过将函数或 lambda 传递给 Fido_Callback.

    driver->setCallBack(Fido_Callback([](SQLString msg) {...}));
  • 通过实现虚拟方法 FidoActionRequested

    class MyWindow : public Fido_Callback
    {
      void FidoActionRequested(sql::SQLString msg) override;
    };
    MyWindow window;
    driver->setCallBack(window);

设置新的回调总是会删除以前的回调。要禁用活动回调并恢复默认行为,请nullptr作为函数回调传递。例子:

driver->setCallBack(Fido_Callback(nullptr));

有关 FIDO 身份验证的更多信息,请参阅 FIDO 可插入身份验证