Py学习  »  Luke Fritz RandomSeed  »  全部回复
回复总数  1
9 年前
回复了 Luke Fritz RandomSeed 创建的主题 » mysqli_connect():(28000/1045):拒绝用户“xxx”@“xxx”(使用密码:是)[重复]

你可能有一个匿名用户 ''@'localhost' ''@'127.0.0.1' 是的。

按照 the manual :

当可能有多个匹配项时,服务器必须确定 使用它们。它解决这个问题如下:(…)

  • 当客户机尝试连接时,服务器会查看行 [表mysql.user的] 按顺序排列。
  • 服务器使用与客户端主机名和用户名匹配的第一行。

(…) 服务器使用排序规则对行进行排序 首先是最具体的主机值 是的。 文字主机名 [例如“localhost”] IP地址是最具体的。

因此,这样的匿名用户将“屏蔽”任何其他用户 '[any_username]'@'%' 从连接时 localhost 是的。

'bill'@'localhost' 不匹配 'bill'@'%' ,但会匹配(例如) '@'本地主机' 在动手之前。

建议的解决方案是删除这个匿名用户(这通常是一件好事)。


下面的编辑大多与主要问题无关。这些只是为了回答本主题中其他评论中提出的一些问题。

编辑1

身份验证 “帐单”@“%” 通过插座。

    root@myhost:/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() |
    +----------------+----------------+
    | bill@localhost | bill@%         |
    +----------------+----------------+
    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)

编辑2

完全相同的设置,除了我重新激活了网络,现在我创建了一个匿名用户 '@'本地主机' 是的。

    root@myhost:/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

    root@myhost:/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)
    root@myhost:/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)
    root@myhost:/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)

编辑3

与编辑2中的情况相同,现在提供匿名用户的密码。

    root@myhost:/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() |
    +----------------+----------------+
    | bill@localhost | @localhost     |
    +----------------+----------------+
    1 row in set (0.01 sec)

结论1,编辑1:一个人可以认证为 “帐单”@“%” 通过插座。

结论2,来自编辑2:一个人是通过TCP连接还是通过套接字连接对身份验证过程没有影响(除了一个人不能像其他人一样连接,但是 'something'@'localhost' 显然是通过插座)。

结论3,来自编辑3:尽管我指定 -ubill ,我已被授予作为匿名用户的访问权限。这是因为上面建议的“排序规则”。注意,在大多数默认安装中, a no-password, anonymous user exists (并应固定/移除)。