Bạn có thể có một người dùng ẩn danh ''@'localhost'
hoặc ''@'127.0.0.1'
.
Theo hướng dẫn sử dụng :
Khi có thể có nhiều kết quả phù hợp, máy chủ phải xác định xem nên sử dụng loại nào. Nó giải quyết vấn đề này như sau:(...)
- Khi một ứng dụng khách cố gắng kết nối, máy chủ sẽ xem xét các hàng [của bảng mysql.user] theo thứ tự đã sắp xếp.
- Máy chủ sử dụng hàng đầu tiên khớp với tên máy khách và tên người dùng.
(...) Máy chủ sử dụng các quy tắc sắp xếp để sắp xếp các hàng có giá trị Máy chủ cụ thể nhất trước tiên Tên máy chủ lưu trữ .Literal [chẳng hạn như 'localhost'] và địa chỉ IP là địa chỉ cụ thể nhất.
Do đó, một người dùng ẩn danh như vậy sẽ "che giấu" bất kỳ người dùng nào khác như '[any_username]'@'%'
khi kết nối từ localhost
.
'bill'@'localhost'
không khớp với 'bill'@'%'
, nhưng sẽ khớp (ví dụ) ''@'localhost'
trước sau.
Giải pháp được đề xuất là loại bỏ người dùng ẩn danh này (dù sao đây cũng là điều nên làm).
Các chỉnh sửa bên dưới hầu hết không liên quan đến câu hỏi chính. Đây chỉ nhằm mục đích trả lời một số câu hỏi được nêu ra trong các nhận xét khác trong chuỗi này.
Chỉnh sửa 1
Xác thực dưới dạng 'bill'@'%'
thông qua một ổ cắm.
[email protected]:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass --socket=/tmp/mysql-5.5.sock Welcome to the MySQL monitor (...) mysql> SELECT user, host FROM mysql.user; +------+-----------+ | user | host | +------+-----------+ | bill | % | | root | 127.0.0.1 | | root | ::1 | | root | localhost | +------+-----------+ 4 rows in set (0.00 sec) mysql> SELECT USER(), CURRENT_USER(); +----------------+----------------+ | USER() | CURRENT_USER() | +----------------+----------------+ | [email protected] | [email protected]% | +----------------+----------------+ 1 row in set (0.02 sec) mysql> SHOW VARIABLES LIKE 'skip_networking'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | skip_networking | ON | +-----------------+-------+ 1 row in set (0.00 sec)
Chỉnh sửa 2
Thiết lập giống hệt nhau, ngoại trừ việc tôi đã kích hoạt lại mạng và bây giờ tôi tạo một người dùng ẩn danh ''@'localhost'
.
[email protected]:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql Welcome to the MySQL monitor (...) mysql> CREATE USER ''@'localhost' IDENTIFIED BY 'anotherpass'; Query OK, 0 rows affected (0.00 sec) mysql> Bye [email protected]:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \ --socket=/tmp/mysql-5.5.sock ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES) [email protected]:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \ -h127.0.0.1 --protocol=TCP ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES) [email protected]:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \ -hlocalhost --protocol=TCP ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)
Chỉnh sửa 3
Tình huống tương tự như trong chỉnh sửa 2, hiện cung cấp mật khẩu của người dùng ẩn danh.
[email protected]:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -panotherpass -hlocalhost Welcome to the MySQL monitor (...) mysql> SELECT USER(), CURRENT_USER(); +----------------+----------------+ | USER() | CURRENT_USER() | +----------------+----------------+ | [email protected] | @localhost | +----------------+----------------+ 1 row in set (0.01 sec)
Kết luận 1, từ chỉnh sửa 1:Người ta có thể xác thực là 'bill'@'%'
thông qua một ổ cắm.
Kết luận 2, từ chỉnh sửa 2:Cho dù một người kết nối thông qua TCP hay thông qua một ổ cắm không ảnh hưởng đến quá trình xác thực (ngoại trừ một người không thể kết nối với bất kỳ ai khác ngoài 'something'@'localhost'
rõ ràng là thông qua một ổ cắm).
Kết luận 3, từ chỉnh sửa 3:Mặc dù tôi đã chỉ định -ubill
, Tôi đã được cấp quyền truy cập với tư cách là người dùng ẩn danh. Điều này là do "quy tắc sắp xếp" được khuyến cáo ở trên. Lưu ý rằng trong hầu hết các cài đặt mặc định, không có mật khẩu, ẩn danh người dùng tồn tại
(và cần được bảo mật / gỡ bỏ).