之前一個(gè)客戶(hù)的項(xiàng)目,使用root用戶(hù)連接的MySQL數(shù)據(jù),為了提高安全性,準(zhǔn)備降權(quán)為普通用戶(hù)連接。
使用grant語(yǔ)句建立了用戶(hù),主機(jī)限制使用的%,也就是不限制主機(jī)。(因?yàn)闆](méi)有開(kāi)啟MySQL端口,所以localhost也意義不大)。FLUSH PRIVILEGES也是執(zhí)行了的。
但是登錄的提示就一直登錄不上,如下圖。

以為密碼輸錯(cuò)了,還使用 set password for 重置了MySQL用戶(hù)密碼,依舊無(wú)法登陸。懷疑人生的我去看了用戶(hù)表,用戶(hù)也是存在的,主機(jī)也確實(shí)沒(méi)限制,如下圖。

于是查詢(xún)解決方案,查出了以下知識(shí)點(diǎn)。
MySQL的簡(jiǎn)要認(rèn)證算法如下:
當(dāng)用戶(hù)從客戶(hù)端請(qǐng)求登陸時(shí),MySQL將授權(quán)表中的條目與客戶(hù)端所提供的條目進(jìn)行比較,包括用戶(hù)的用戶(hù)名,密碼和主機(jī)。
授權(quán)表中的Host字段是可以使用通配符作為模式進(jìn)行匹配的,如test.example.com, %.example.com, %.com和%都可以匹配test.example.com這個(gè)主機(jī)。
授權(quán)表中的User字段不允許使用模式匹配,但是可以有一個(gè)空字符的用戶(hù)名代表匿名用戶(hù),并且空字符串可以匹配所有的用戶(hù)名,就像通配符一樣。
當(dāng)user表中的Host和User有多個(gè)值可以匹配客戶(hù)端提供的主機(jī)和用戶(hù)名時(shí),MySQL將user表讀入內(nèi)存,并且按照一定規(guī)則排序,按照排序規(guī)則讀取到的第一個(gè)匹配客戶(hù)端用戶(hù)名和主機(jī)名的條目對(duì)客戶(hù)端進(jìn)行身份驗(yàn)證。
排序規(guī)則:
引用自cnblogs
對(duì)于Host字段,按照匹配的精確程度進(jìn)行排序,越精確的排序越前,例如當(dāng)匹配test.example.com這個(gè)主機(jī)時(shí), %.example.com比%.com更精確,而test.example.com比%.example.com更精確。
對(duì)于User字段,非空的字符串用戶(hù)名比空字符串匹配的用戶(hù)名排序更靠前。
User和Host字段都有多個(gè)匹配值,MySQL使用主機(jī)名排序最前的條目,在主機(jī)名字段相同時(shí)再選取用戶(hù)名排序更前的條目。
因此,如果User和Host字段都有多個(gè)匹配值,主機(jī)名最精確匹配的條目被用戶(hù)對(duì)用戶(hù)進(jìn)行認(rèn)證。
這樣一來(lái),問(wèn)題解決方案就出來(lái)了。解決方案:刪除庫(kù)中存在的匿名用戶(hù)
經(jīng)過(guò)查詢(xún),確實(shí)存在匿名用戶(hù),如下圖,刪除后即可成功登錄。

相關(guān)文章
發(fā)表回復(fù)
您的郵箱地址不會(huì)被公開(kāi)。
