我正在设置一个 mysql 服务器,并尝试为我创建的每个数据库创建一个非特权用户来登录。我可以从控制台成功以 root 身份登录,但当我尝试以“rails”用户身份登录时失败。这是我的用户的样子:
mysql>从 mysql.user 中选择用户、主机、密码; +---------+-----------+----------------------------------------------------------+ | 用户 | 主机 | 密码 | +---------+-----------+----------------------------------------------------------+ | 根 | 本地主机 | *9CAF1C22F1F66A8C47C74E7F6700391F0AB817F0 | | 根| 127.0.0.1 | *C453FFD4FD2470D5CD56BB9A229BDC7388F3A170 | |数据狗 |本地主机 | *AEB79FF15C0A9CA185F3768235927ADDD9667C85 | | 轨道 | 本地主机 | *9CAF1C22F1F66A8C47C74E7F6700391F0AB817F0 | +---------+-----------+----------------------------------------------------------+
rails 用户的授权如下:
mysql> 显示“rails”@“localhost”的授权;'; +------------------------------------------------------------------------------------------------------------------------+ | 为 rails@localhost 提供资助 | +------------------------------------------------------------------------------------------------------------------------+ | 授予'rails'@'localhost' 对 *.* 的使用权,密码为 '*9CAF1C22F1F66A8C47C74E7F6700391F0AB817F0',需要 SSL | | 授予 `resumecompanion_staging` 的所有权限。* 至 'rails'@'localhost' | +------------------------------------------------------------------------------------------------------------------------+
请注意,我已将 root 用户密码和 rails 密码设置为相同。我这样做是为了确认我输入了正确的密码,但仍然不起作用。
当我尝试使用 rails 用户登录时,我看到以下内容:
mysql -u rails -h localhost -p --protocol=TCP resumecompanion_staging 输入密码: 错误 1045(28000):拒绝用户“rails”@“localhost”访问(使用密码:是)
有人知道我做错了什么吗?
谢谢,
乔什
答案1
GRANT ... TO 'rails'@'localhost' ... REQUIRE SSL
首先,要求与 localhost 建立 SSL 连接是完全没有意义的。SSL 或 TLS 提供运输安全对于不会离开实际系统的通信,您不需要它,它不会提供任何额外的安全性,而只会提供额外的开销。
此外,Linux/UNIX 上的官方 MySQL 库将关键字本地主机与您预期的不同,将使用 Unix 套接字,而不是 TCP。从手动的:
在 Unix 上,MySQL 程序将主机名本地主机具体来说,与其他基于网络的程序相比,这种方式可能与您预期的不同。对于与 localhost 的连接,MySQL 程序尝试使用 Unix 套接字文件连接到本地服务器。即使给出了 --port 或 -P 选项来指定端口号,也会发生这种情况。... 您还可以使用选项明确指定连接协议
--protocol=TCP
。
使用套接字比使用 TCP/IP 具有更高的性能,并且据我所知,套接字不支持 SSL(并且也不需要)。
如果您确实强制建立 TCP 连接,那么您也需要使用 GRANT 通过 TCP 访问,GRANT ... TO 'rails'@'127.0.0.1' ...
因为授予连接localhost
意味着使用 Unix 套接字。
特别没用的一点是,对于错误消息,MySQL 遵循惯例对 ip 地址进行反向 DNS 查找,这会将 ip 地址转换127.0.0.1
为本地主机。