允许对MySQL数据库进行通配符(%)访问,并出现错误“拒绝对'<user>'@'localhost'的访问”


16

我已经创建了一个数据库和一个用户,并允许通过以下方式进行访问:

create user 'someuser'@'%' identified by 'password';
grant all privileges on somedb.* to 'someuser' with grant option;

但是,当我尝试连接到MySQL时,出现以下错误:

$ mysql -u someuser -p
> Enter Password:
> ERROR 1045 (28000): Access denied for user 'someuser'@'localhost' (using password: YES)

如果“%”是通配符,那么它也不会启用本地主机吗?但是,如果我不指定要使用密码,则可以很好地连接到数据库,这没有任何意义,因为在创建用户时要指定密码。

Answers:


16

尝试与进行连接 mysql -u someuser -p -h 127.0.0.1

如果可以不使用密码进行连接,则说明您已将凭据保存在.my.cnf中,或者创建了一个无需密码即可访问的帐户。


mysql docs中的此注释也可能相关。

http://dev.mysql.com/doc/refman/5.1/en/access-denied.html

如果无法弄清为什么拒绝访问,请从用户表中删除所有具有包含通配符的主机值的条目(包含“%”或“ _”字符的条目)。一个非常常见的错误是使用Host ='%'和User ='some_user'插入一个新条目,认为这允许您指定本地主机从同一台计算机进行连接。这样做不起作用的原因是默认特权包括一个带有Host ='localhost'和User =''的条目。由于该条目的主机值'localhost'比'%'更具体,因此从localhost连接时,它优先于新条目使用!正确的过程是使用Host ='localhost'和User ='some_user'插入第二个条目,


+1包括主机定义和〜/ .my.cnf参考
Andy

7

我很确定您需要以下内容:

使用授予选项将somedb。*上的所有特权授予'someuser'@'%';

您的GRANT语句缺少主机名声明。


应指定位置:GRANT ALL ON somedb.* TO 'someuser'@'10.1.10.1';
tacotuesday 2012年

6

如果您无法使用someuser @'%'连接到mysql,其中'%'是主机名的通配符,则请确保您的用户表中没有'@localhost'条目。使用以下SQL语句确认:

    mysql> SELECT * FROM user WHERE user='' AND host='localhost';

如果存在“ @localhost”,则通过发出以下SQL语句将其删除:

    mysql> DELETE FROM user WHERE user='' AND host='localhost';

然后最后

    FLUSH PRIVILEGES;

现在someuser @'%'将连接到数据库。


授予“用户名” @“本地主机”特权不会导致对来自不同位置的同一用户的授予不起作用。
tacotuesday,2012年

这有什么关系?“本地主机”的“用户”是什么原因?
史蒂夫·布佐纳斯

1
@SteveBuzonas这是绝对相关的。它提供了Zoredache发布的答案的代码示例。Localhost比'%'更具体,因此,如果您尝试通过localhost与仅具有'%'访问权限的用户进行连接,则localhost条目更为具体,因此mysql尝试登录localhost,但期望使用空用户名和空密码。由于这些不是提供的凭据,因此您将获得拒绝访问错误。通过删除这些条目,它允许用户访问“%”。
bstakes

@bstakes mysql客户端的默认行为是使用shell用户名(如果未指定)。该问题在示例和错误消息中都有一个用户。我很好奇''用户将如何与命名用户冲突。是通配符?
Steve Buzonas 2015年

@SteveBuzonas''在本地主机方面的作用类似于通配符。从MySQL Docs开始,并在上面的答案中显示了您提到的默认值:“由于该条目的主机值'localhost'比'%'更具体,因此从localhost连接时,它优先于新条目使用!正确的过程是插入带有Host ='localhost'和User ='some_user'的第二个条目,或删除带有Host ='localhost'和User =''的条目。”
bstakes 2015年

4

我的理解并准备对此进行更正,是MySQL将localhost分别视为%。即本地主机不包含在通配符中。


dev.mysql.com/doc/refman/5.1/en/connection-access.html中提供的示例使我相信这可能不正确。您还有其他参考吗?
华纳2010年

我对此问题的理解是基于其他人在打印和口头报告了相同的问题,并通过使用“%”和“ localhost”创建2个用户来解决此问题。我不记得曾经真正看到过正式记录。
John Gardeniers 2010年

1
至少在Ubuntu 12.04 LTS上,这似乎是正确的
Dex

我发生的事情是我曾经经历user@%过,直到我包括在内才有效user@localhost。然后我看到了答案stackoverflow.com/a/29421084/4850646,并意识到我有一个匿名用户host localhost。我删除了所有匿名localhost用户,即使删除了 user@localhost(并且只允许user@%),能够从该用户访问。似乎因为localhost比更加具体%,所以它首先尝试localhost用户,即使它是匿名用户也是如此!
卢卡斯·巴斯克罗托

0

flush privileges;创建用户后您是否运行过?如果不这样做,则在重新启动服务器之前,不会更改用户/权限。

然后,检查您是否没有'%'@'localhost'条目。


4
使用“创建用户”和“授予”自动刷新特权。如果您直接操作mysql数据库,则只需要刷新特权。
Zoredache
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.