首先,我要提一提的是,我经历了许多建议的问题,但都没有找到答案。这是我在做什么。

我已连接到我的Amazon EC2实例。我可以使用以下命令以MySQL root登录:

mysql -u root -p


然后我用主机%创建了一个新的用户账单

CREATE USER 'bill'@'%' IDENTIFIED BY 'passpass';


授予用户帐单所有特权:

grant all privileges on *.* to 'bill'@'%' with grant option;


然后,我从root用户退出并尝试使用bill登录:

mysql -u bill -p


输入正确的密码并收到以下错误消息:


  错误1045(28000):用户'bill'@'localhost'的访问被拒绝(使用密码:是)

最佳答案

您可能有一个匿名用户''@'localhost'''@'127.0.0.1'

根据the manual


  当可能有多个匹配项时,服务器必须确定哪个
  他们使用。它可以解决此问题,如下所示:(...)
  
  
  当客户端尝试连接时,服务器将按排序顺序浏览[表mysql.user]的行。
  服务器使用与客户端主机名和用户名匹配的第一行。
  
  
  (...)
  服务器使用排序规则,该规则首先对具有最特定的主机值的行进行排序。
  文字主机名[例如'localhost']和IP地址是最具体的。


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

'bill'@'localhost'确实匹配'bill'@'%',但是会事先匹配(例如)''@'localhost'

推荐的解决方案是删除该匿名用户(无论如何通常这样做是一件好事)。



下面的编辑与主要问题无关。这些仅用于回答此主题中其他注释中提出的一些问题。

编辑1

通过套接字认证为'bill'@'%'


    root @ myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass --socket = / tmp / mysql-5.5.sock
    欢迎使用MySQL监视器(...)

    mysql> SELECT用户,主机FROM mysql.user;
    + ------ + ----------- +
    |用户|主机|
    + ------ + ----------- +
    |帐单| %|
    |根| 127.0.0.1 |
    |根| :: 1 |
    |根|本地主机|
    + ------ + ----------- +
    设置4行(0.00秒)

    mysql> SELECT USER(),CURRENT_USER();
    + ---------------- + ---------------- +
    | USER()| CURRENT_USER()|
    + ---------------- + ---------------- +
    | bill @ localhost |帐单@%|
    + ---------------- + ---------------- +
    设置1行(0.02秒)

    mysql>显示变量,例如“ skip_networking”;
    + ----------------- + ------- +
    |变量名|价值|
    + ----------------- + ------- +
    | skip_networking |开|
    + ----------------- + ------- +
    设置1行(0.00秒)



编辑2

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


    root @ myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql
    欢迎使用MySQL监视器(...)

    mysql> CREATE USER'@'localhost'由'anotherpass'标识;
    查询正常,受影响的0行(0.00秒)

    mysql>再见

    root @ myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        --socket = / tmp / mysql-5.5.sock
    错误1045(28000):用户'bill'@'localhost'的访问被拒绝(使用密码:是)
    root @ myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        -h127.0.0.1 --protocol = TCP
    错误1045(28000):用户'bill'@'localhost'的访问被拒绝(使用密码:是)
    root @ myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        -hlocalhost --protocol = TCP
    错误1045(28000):用户'bill'@'localhost'的访问被拒绝(使用密码:是)



编辑3

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


    root @ myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -panotherpass -hlocalhost
    欢迎使用MySQL监视器(...)

    mysql> SELECT USER(),CURRENT_USER();
    + ---------------- + ---------------- +
    | USER()| CURRENT_USER()|
    + ---------------- + ---------------- +
    | bill @ localhost | @localhost |
    + ---------------- + ---------------- +
    设置1行(0.01秒)



结论1,来自编辑1:一个人可以通过套接字认证为'bill'@'%'

结论2,摘自编辑2:无论是通过TCP连接还是通过套接字连接都不会对身份验证过程产生影响(显然,除了'something'@'localhost'以外,其他任何人都不能通过套接字连接)。

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

07-28 02:39
查看更多