mysql沒法本地、外網同時訪問 Host is not allowed to connect t

mysql沒法外網鏈接 Host * is not allowed to connect to this MySQL serverphp

在本機登入mysql後,更改"mysql"數據庫裏的"user"表裏的"host"項,從"localhost"改成'%'。mysql

代碼以下 linux

mysql>sql

mysql>use mysql;數據庫

mysql>select host from user where user='root';安全

mysql>update user set Host='%' where User='root';ide

#查看mysql庫中的user表的host值(便可進行鏈接訪問的主機/IP名稱)函數

Linux中的mysql,user值爲root的,有三條記錄
mysql沒法本地、外網同時訪問 Host  is not allowed to connect t
修改了這條有密碼的記錄,重啓mysql服務後,數據庫能遠程訪問。
mysql沒法本地、外網同時訪問 Host  is not allowed to connect t
可是控制檯就沒法登陸mysql了。
mysql沒法本地、外網同時訪問 Host  is not allowed to connect t
緣由是,user表中其它幾條記錄影響了,所有刪掉,只留下有密碼的這一條記錄便可。
mysql沒法本地、外網同時訪問 Host  is not allowed to connect t
2018年12月8日,客戶用phpStudy,用了上述方法,只剩下一條root的,127.0.0.1沒法登陸,用localhost就能夠登陸,執行這個命令,其實就是在user表裏添加一條記錄
grant all privileges on . to 'root'@'127.0.0.1' identified by 'tXkj-8002-vErygood';this

2018年12月9日,在CentOS虛擬機裏裝好mysql,執行如下語句,物理機192.168.1.21仍是沒法訪問
grant all privileges on . to 'root'@'%' identified by '123456';
執行了如下語句,才能夠訪問
grant all privileges on . to 'root'@'192.168.1.21' identified by '123456';3d

緣由以下文所示:

https://www.linuxidc.com/Linux/2015-03/115164.htm
在安裝完成MySQL後,咱們一般添加擁有相應權限的普通用戶用來訪問數據庫。在使用用戶本地登陸數據庫的時候,常常會出現怎麼登陸也沒法登陸的狀況,可是從其餘的mysql客戶端卻能夠登陸。
[root@mysql01 ~]# mysql -userver -p123456
ERROR 1045 (28000): Access denied for user 'server'@'localhost' (using password: YES)
本地登陸失敗;
[root@mysql02 ~]# mysql -h192.168.47.166 -userver -p123456
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.5.36-log Source distribution
遠程登陸成功;
1、登陸後查看mysql.user表的狀況
image
能夠看到,個人數據庫中有server用戶和匿名用戶localhost;
•server用戶的密碼是'server'
•匿名用戶的密碼爲空
2、在本機用server用戶登陸,發現不用密碼能夠登陸;
[root@mysql01 ~]# mysql -userver -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.5.36-log Source distribution
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> SELECT USER(), CURRENT_USER();
+--------------------------+-----------------------+
| USER() | CURRENT_USER() |
+-------------------------+------------------------+
| server@localhost | @localhost |
+-------------------------+-------------------------+
1 row in set (0.00 sec)br/>登陸成功了,使用USER()和CURRENT_USER()兩個函數查看所使用的用戶。
•USER()函數返回你在客戶端登錄時指定的用戶名和主機名。
•CURRENT_USER()函數返回的是MySQL使用受權表中的哪一個用戶來認證你的登陸請求。
這裏發現,我使用'server'@'localhost'這個帳戶登陸數據庫(由於在本地登錄時沒指定主機,默認是以localhost登陸),可是數據庫使用的是''@'localhost'這個帳戶來進行登陸認證,而''@'localhost'這個匿名用戶是沒有密碼的,所以我輸入空密碼登陸成功了。可是登陸後,所對應的用戶的匿名用戶。
通常在MySQL在安裝完畢後,咱們使用mysql_install_db這個腳本生成受權表,會默認建立''@'localhost'這個匿名用戶。正是由於這個匿名用戶,影響了其餘用戶從本地登陸的認證。
那麼MySQL是如何進行用戶身份認證呢?
1、當用戶從客戶端請求登錄時,MySQL將受權表中的條目與客戶端所提供的條目進行比較,包括用戶的用戶名,密碼和主機。受權表中的Host字段是可使用通配符做爲模式進行匹配的,如test.example.com, %.example.com, %.com和%均可以匹配test.example.com這個主機。受權表中的User字段不容許使用模式匹配,可是能夠有一個空字符的用戶名錶明匿名用戶,而且空字符串能夠匹配全部的用戶名,就像通配符同樣。 當user表中的Host和User有多個值能夠匹配客戶端提供的主機和用戶名時,MySQL將user表讀入內存,而且按照必定規則排序,按照排序規則讀取到的第一個匹配客戶端用戶名和主機名的條目對客戶端進行身份驗證。
2、排序規則:對於Host字段,按照匹配的精確程度進行排序,越精確的排序越前,例如當匹配test.example.com這個主機時, %.example.com比%.com更精確,而test.example.com比%.example.com更精確。對於User字段,非空的字符串用戶名比空字符串匹配的用戶名排序更靠前。 User和Host字段都有多個匹配值,MySQL使用主機名排序最前的條目,在主機名字段相同時再選取用戶名排序更前的條目。所以,若是User和Host字段都有多個匹配值,主機名最精確匹配的條目被用戶對用戶進行認證。
瞭解了這個認證流程,就知道爲何server登陸失敗了。
使用GaMe在本機登陸數據時,不指定-h參數默認爲localhost主機登陸,而在MySQL中有兩個匹配的條目:'server'@'%' 和 ''@'localhost'br/>匿名用戶可以匹配的緣由上面說過,空字符串能夠匹配全部的用戶名,就像通配符同樣。根據MySQL認證時的排序規則,第一個條目的用戶名排序更前,第二個條目的主機名更精確,排序更前。而MySQL會優先使用主機名排序第一的條目進行身份認證,所以''@'localhost'被用戶對客戶端進行認證。所以,只有使用匿名用戶的空密碼才能登陸進數據庫。就會出現下面的狀況了。解決的方法:刪除匿名用戶(僅僅爲了安全也有這個必要)爲何root用戶不會受影響,而只有普通用戶不能從本地登陸?由於mysql_install_db腳本會在受權表中生成'root'@'localhost'這個帳戶。一樣的,使用root登陸MySQL 時,'root'@'localhost'和''@'localhost'都能匹配登陸的帳戶,可是根據排序規則,主機名相同,而用戶名非空字符串優先,所以'root'@'localhost'這個條目的排序更靠前。使用root本地登陸是不會被匿名用戶遮蓋。

相關文章
相關標籤/搜索