การอนุญาตให้ใช้ wildcard (%) การเข้าถึงบนฐานข้อมูล MySQL ได้รับข้อผิดพลาด“ การเข้าถึงถูกปฏิเสธสำหรับ '<user>' @ 'localhost'”


17

ฉันได้สร้างฐานข้อมูลและผู้ใช้และอนุญาตให้เข้าถึงผ่านทางต่อไปนี้:

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)

หาก "%" เป็นไวด์การ์ดแล้วจะไม่เปิดใช้งาน localhost หรือไม่ อย่างไรก็ตามหากฉันไม่ได้ระบุว่าฉันต้องการใช้รหัสผ่านฉันสามารถเชื่อมต่อได้ดีกับฐานข้อมูลซึ่งไม่สมเหตุสมผลเพราะฉันระบุรหัสผ่านเมื่อฉันสร้างผู้ใช้

คำตอบ:


17

mysql -u someuser -p -h 127.0.0.1ลองเชื่อมต่อกับ

หากคุณสามารถเชื่อมต่อโดยไม่มีรหัสผ่านแสดงว่าคุณได้บันทึกข้อมูลรับรองไว้ใน. my.cnf หรือคุณสร้างบัญชีที่อนุญาตการเข้าถึงโดยไม่ต้องใช้รหัสผ่าน


ความคิดเห็นจากเอกสาร mysql นี้อาจเกี่ยวข้อง

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

หากคุณไม่สามารถหาสาเหตุที่ทำให้คุณปฏิเสธการเข้าถึงให้ลบรายการทั้งหมดที่มีค่าโฮสต์ที่มีอักขระตัวแทน (ตารางที่มีอักขระ '%' หรือ '_') ออกจากตารางผู้ใช้ ข้อผิดพลาดที่พบบ่อยมากคือการแทรกรายการใหม่ด้วย Host = '%' และ User = 'some_user' โดยคิดว่าสิ่งนี้ช่วยให้คุณระบุ localhost เพื่อเชื่อมต่อจากเครื่องเดียวกัน เหตุผลที่ใช้ไม่ได้คือสิทธิ์เริ่มต้นรวมรายการที่มี 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

6

หากคุณไม่สามารถเชื่อมต่อกับ mysql โดยใช้ someuser @ '%' โดยที่ '%' เป็น wildcard สำหรับชื่อโฮสต์ตรวจสอบให้แน่ใจว่าคุณไม่มีรายการ '' @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 @ '%' จะเชื่อมต่อกับฐานข้อมูล


การให้สิทธิ์ 'ชื่อผู้ใช้' @ 'localhost' จะไม่ส่งผลให้ผู้ใช้รายเดียวกันจากที่อื่นไม่ทำงาน
tacotuesday

สิ่งนี้เกี่ยวข้องกันอย่างไร '' ผู้ใช้ที่ 'localhost' เป็นสาเหตุอะไร
Steve Buzonas

1
@SteveBuzonas นี้เกี่ยวข้องอย่างยิ่ง มันมีตัวอย่างรหัสสำหรับคำตอบที่ Zoredache โพสต์ Localhost มีความเฉพาะเจาะจงมากกว่า '%' ดังนั้นหากคุณพยายามเชื่อมต่อผ่าน localhost กับผู้ใช้ที่มีการเข้าถึงที่ '%' เท่านั้นรายการ localhost นั้นเฉพาะเจาะจงมากขึ้นดังนั้น mysql จึงพยายามลงชื่อเข้าใช้ที่ localhost แต่คาดว่าจะมีชื่อผู้ใช้และ รหัสผ่านว่างเปล่า เนื่องจากสิ่งเหล่านั้นไม่ใช่หนังสือรับรองที่ให้ไว้คุณจะได้รับข้อผิดพลาดถูกปฏิเสธการเข้าถึง เมื่อลบรายการเหล่านี้จะอนุญาตการเข้าถึงสำหรับผู้ใช้ที่ '%'
bstakes

@bstakes พฤติกรรมเริ่มต้นของไคลเอนต์ mysql คือการใช้ชื่อผู้ใช้เชลล์ของคุณหากคุณไม่ได้ระบุไว้ คำถามมีผู้ใช้ในตัวอย่างและในข้อความแสดงข้อผิดพลาด ฉันอยากรู้ว่าผู้ใช้ '' จะขัดแย้งกับผู้ใช้ที่มีชื่ออย่างไร สัญลักษณ์แทนคืออะไร
Steve Buzonas

@SteveBuzonas '' ทำงานเหมือน wildcard ที่เกี่ยวข้องกับ localhost จากเอกสาร MySQL และแสดงในคำตอบข้างต้นอ้างอิงถึงค่าเริ่มต้นที่คุณกล่าวถึง: "เนื่องจากรายการนั้นมีค่าโฮสต์ 'localhost' ที่เฉพาะเจาะจงมากกว่า '%' จึงใช้ในการตั้งค่ารายการใหม่เมื่อเชื่อมต่อจาก localhost ขั้นตอนที่ถูกต้องคือการแทรกรายการที่สองด้วย Host = 'localhost' และ User = 'some_user' หรือเพื่อลบรายการที่มี Host = 'localhost' และ User = ''
bstakes

4

ความเข้าใจของฉันและฉันพร้อมที่จะแก้ไขในเรื่องนี้ก็คือว่า MySQL จัดการ localhost แยกเป็น% ie localhost ไม่รวมอยู่ในไวด์การ์ด


ตัวอย่างที่ให้ไว้ในdev.mysql.com/doc/refman/5.1/en/connection-access.htmlทำให้ฉันเชื่อว่านี่อาจไม่ถูกต้อง คุณมีการอ้างอิงเป็นอย่างอื่นหรือไม่?
วอร์เนอร์

ความเข้าใจของฉันในเรื่องนี้ขึ้นอยู่กับคนอื่น ๆ ที่รายงานปัญหาเดียวกันทั้งในการพิมพ์และด้วยวาจาและการแก้ไขโดยการสร้างผู้ใช้ 2 คนโดยใช้ "%" และ "localhost" ฉันจำไม่ได้ว่าเคยเห็นเอกสารอย่างเป็นทางการว่า
John Gardeniers

1
สิ่งนี้ดูเหมือนจะถูกต้องบน Ubuntu 12.04 LTS เป็นอย่างน้อย
Dex

เกิดอะไรขึ้นกับฉันก็คือฉันมีและมันไม่ได้ทำงานจนกว่าฉันจะรวมuser@% user@localhostจากนั้นผมเห็นคำตอบstackoverflow.com/a/29421084/4850646localhostและตระหนักว่าผมมีผู้ใช้ที่ไม่ระบุชื่อกับโฮสต์ ฉันลบผู้ใช้ที่ไม่ระบุชื่อออกทั้งหมดและสามารถเข้าถึงได้จากlocalhostผู้ใช้รายนั้นแม้ว่าจะลบออก user@localhost (และอนุญาตเท่านั้นuser@%) ดูเหมือนว่าเพราะlocalhostมีความเฉพาะเจาะจงมากกว่า%นั้นจะลองเป็นlocalhostผู้ใช้ก่อนถึงแม้ว่าจะเป็นผู้ใช้ที่ไม่ระบุตัวตนก็ตาม!
Lucas Basquerotto

0

คุณรันflush privileges;หลังจากสร้างผู้ใช้แล้วหรือยัง? หากไม่มีการเปลี่ยนแปลงผู้ใช้ / การอนุญาตจะไม่ดำเนินการจนกว่าจะรีสตาร์ทเซิร์ฟเวอร์

จากนั้นตรวจสอบว่าคุณไม่มีรายการ '%' @ 'localhost'


4
การใช้ 'สร้างผู้ใช้' และ 'อนุญาต' จะล้างสิทธิ์โดยอัตโนมัติ คุณควรจะต้องล้างสิทธิ์หากคุณกำลังจัดการฐานข้อมูล mysql โดยตรง
Zoredache
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.