Cho phép truy cập ký tự đại diện (%) trên db db, bị lỗi truy cập từ chối cho '<user>' @ 'localhost'


16

Tôi đã tạo cơ sở dữ liệu và người dùng và cho phép truy cập thông qua các mục sau:

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

tuy nhiên, khi tôi cố gắng kết nối với MySQL, tôi gặp lỗi sau:

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

Nếu "%" là ký tự đại diện, thì nó cũng không kích hoạt localhost chứ? Tuy nhiên, nếu tôi không chỉ định rằng tôi muốn sử dụng mật khẩu, thì tôi có thể kết nối tốt với cơ sở dữ liệu, điều này vô nghĩa vì tôi chỉ định mật khẩu khi tôi tạo người dùng.

Câu trả lời:


16

Hãy thử kết nối với mysql -u someuser -p -h 127.0.0.1.

Nếu bạn có thể kết nối mà không cần mật khẩu, bạn đã lưu thông tin đăng nhập trong .my.cnf hoặc bạn đã tạo một tài khoản cho phép truy cập mà không cần mật khẩu.


Nhận xét này từ các tài liệu mysql cũng có thể liên quan.

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

Nếu bạn không thể hiểu tại sao bạn bị từ chối truy cập, hãy xóa khỏi bảng người dùng tất cả các mục có giá trị Máy chủ chứa ký tự đại diện (các mục có chứa ký tự '%' hoặc '_'). Một lỗi rất phổ biến là chèn một mục nhập mới với Host = '%' và User = 'some_user', nghĩ rằng điều này cho phép bạn chỉ định localhost để kết nối từ cùng một máy. Lý do điều này không hoạt động là các đặc quyền mặc định bao gồm một mục nhập với Host = 'localhost' và User = ''. Bởi vì mục nhập đó có giá trị Máy chủ 'localhost' cụ thể hơn '%', nên nó được sử dụng để ưu tiên cho mục nhập mới khi kết nối từ localhost! Quy trình đúng là chèn mục nhập thứ hai với Host = 'localhost' và User = 'some_user',


+1 bao gồm định nghĩa máy chủ & tham chiếu ~ / .my.cnf
Andy

7

Tôi khá chắc chắn rằng bạn cần những điều sau đây:

cấp tất cả các đặc quyền trên somedb. * cho 'someuser' @ '%' với tùy chọn cấp;

Câu lệnh GRANT của bạn thiếu một khai báo tên máy chủ.


Một địa điểm nên được chỉ định:GRANT ALL ON somedb.* TO 'someuser'@'10.1.10.1';
tacotuesday

6

Nếu bạn không thể kết nối với mysql bằng someuser @ '%' trong đó '%' là ký tự đại diện cho tên máy chủ, thì hãy đảm bảo bạn không có mục '' @localhost trong bảng người dùng của mình. Xác nhận bằng cách sử dụng câu lệnh SQL sau:

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

Nếu '' @localhost tồn tại, thì hãy xóa nó bằng cách đưa ra câu lệnh SQL sau:

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

sau đó cuối cùng

    FLUSH PRIVILEGES;

Bây giờ someuser @ '%' sẽ kết nối với cơ sở dữ liệu.


Cấp đặc quyền 'tên người dùng' @ 'localhost' sẽ không gây ra trợ cấp cho cùng một người dùng từ một vị trí khác để không hoạt động.
tacotuesday

cái này có liên quan như thế nào? người dùng '' tại 'localhost' gây ra điều gì?
Steve Buzonas

1
@SteveBuzonas Điều này hoàn toàn phù hợp. Nó cung cấp một ví dụ mã cho câu trả lời mà Zoredache đã đăng. Localhost cụ thể hơn '%', vì vậy nếu bạn cố gắng kết nối qua localhost với người dùng chỉ có quyền truy cập ở '%', mục nhập localhost cụ thể hơn, vì vậy mysql cố gắng đăng nhập tại localhost, nhưng mong muốn có tên người dùng trống và mật khẩu trống. Vì đó không phải là thông tin đăng nhập được cung cấp, bạn nhận được lỗi từ chối truy cập. Bằng cách xóa các mục này, nó cho phép người dùng truy cập ở mức '%'.
cược vào

@bstakes hành vi mặc định của máy khách mysql là sử dụng tên người dùng shell của bạn nếu bạn không chỉ định một. câu hỏi có một người dùng trong ví dụ và trong thông báo lỗi. tôi tò mò làm thế nào một người dùng '' sẽ xung đột với một người dùng được đặt tên. là '' một ký tự đại diện?
Steve Buzonas 6/2/2015

@SteveBuzonas '' hoạt động như một ký tự đại diện đối với localhost. Từ Tài liệu MySQL và được hiển thị trong câu trả lời ở trên tham chiếu mặc định mà bạn đã đề cập: "Vì mục nhập đó có giá trị Máy chủ 'localhost' cụ thể hơn '%', nên nó được sử dụng theo mục đích mới khi kết nối từ localhost ! Quy trình đúng là chèn mục nhập thứ hai bằng Host = 'localhost' và User = 'some_user' hoặc xóa mục nhập với Host = 'localhost' và User = ''. "
cược vào

4

Sự hiểu biết của tôi và tôi đã chuẩn bị để sửa lỗi này, rằng MySQL xử lý localhost riêng biệt thành%. tức là localhost không được bao gồm trong ký tự đại diện.


Các ví dụ được cung cấp trong dev.mysql.com/doc/refman/5.1/en/connection-access.html khiến tôi tin rằng điều này có thể không chính xác. Bạn có tài liệu tham khảo khác?
Warner

Sự hiểu biết của tôi về vấn đề này dựa trên những người khác báo cáo cùng một vấn đề, cả bằng bản in và bằng lời nói và giải quyết nó bằng cách tạo 2 người dùng, sử dụng "%" và "localhost". Tôi không thể nhớ bao giờ thực sự nhìn thấy nó chính thức tài liệu mặc dù.
John Gardeniers

1
Điều này có vẻ đúng trên ít nhất Ubuntu 12.04 LTS
Dex

Điều xảy ra với tôi là tôi đã có user@%và nó đã không hoạt động cho đến khi tôi đưa vào user@localhost. Sau đó, tôi thấy câu trả lời stackoverflow.com/a/29421084/4850646 và nhận ra rằng tôi có một người dùng ẩn danh với máy chủ lưu trữ localhost. Tôi đã xóa tất cả người dùng ẩn danh và có thể truy cập từ localhostngười dùng đó, ngay cả sau khi xóa user@localhost (và chỉ cho phép user@%). Có vẻ như vì localhostcụ thể hơn %, nó sẽ thử localhostngười dùng trước, ngay cả khi đó là người dùng ẩn danh!
Lucas Basquerotto

0

Bạn đã chạy flush privileges;sau khi tạo người dùng? Nếu bạn không, các thay đổi đối với người dùng / quyền sẽ không được thực hiện cho đến khi máy chủ được khởi động lại.

Sau đó, kiểm tra xem bạn không có mục '%' @ 'localhost'.


4
sử dụng 'tạo người dùng' và 'cấp' tự động xóa các đặc quyền. Bạn chỉ cần xóa các đặc quyền nếu bạn đang thao túng trực tiếp cơ sở dữ liệu mysql.
Zoredache
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.