Consentire l'accesso con caratteri jolly (%) su MySQL db, ottenendo l'errore "accesso negato per" <utente> "@" localhost ""


16

Ho creato un database e un utente e ho consentito l'accesso tramite:

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

tuttavia, quando provo a connettermi a MySQL ottengo il seguente errore:

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

Se "%" è il carattere jolly, non abiliterebbe anche localhost? Tuttavia, se non specifico che voglio usare una password, posso collegarmi perfettamente al database, il che non ha senso perché sto specificando una password quando ho creato l'utente.

Risposte:


16

Prova a connetterti con mysql -u someuser -p -h 127.0.0.1.

Se riesci a connetterti senza password, hai salvato le credenziali in un file .my.cnf o hai creato un account che consente l'accesso senza password.


Questo commento dai documenti mysql può anche essere correlato.

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

Se non riesci a capire perché viene negato l'accesso, rimuovi dalla tabella utenti tutte le voci che hanno valori Host contenenti caratteri jolly (voci che contengono caratteri '%' o '_'). Un errore molto comune è quello di inserire una nuova voce con Host = '%' e User = 'some_user', pensando che ciò ti consenta di specificare localhost per la connessione dalla stessa macchina. Il motivo per cui ciò non funziona è che i privilegi predefiniti includono una voce con Host = 'localhost' e User = ''. Poiché quella voce ha un valore Host "localhost" più specifico di "%", viene utilizzata in preferenza alla nuova voce quando ci si collega da localhost! La procedura corretta consiste nell'inserire una seconda voce con Host = 'localhost' e User = 'some_user',


+1 inclusa definizione host e riferimento ~ / .my.cnf
Andy

7

Sono abbastanza sicuro che hai bisogno di quanto segue:

concedere tutti i privilegi su somedb. * a 'someuser' @ '%' con l'opzione grant;

La tua dichiarazione GRANT manca di una dichiarazione del nome host.


Dovrebbe essere specificato un luogo:GRANT ALL ON somedb.* TO 'someuser'@'10.1.10.1';
tacotuesday

6

Se non riesci a connetterti a mysql usando someuser @ '%' dove '%' è il carattere jolly per il nome host, assicurati di non avere '' @localhost nella tua tabella utente. Conferma utilizzando la seguente istruzione SQL:

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

Se '' @localhost è esistente, rimuoverlo emettendo la seguente istruzione SQL:

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

poi infine

    FLUSH PRIVILEGES;

Ora someuser @ '%' si connetterà al database.


Concedere i privilegi 'username' @ 'localhost' non farà in modo che le sovvenzioni sullo stesso utente da una posizione diversa non funzionino.
martedì

come è rilevante? che cosa causa l'utente "localhost"?
Steve Buzonas,

1
@SteveBuzonas Questo è assolutamente rilevante. Fornisce un esempio di codice per la risposta postata da Zoredache. Localhost è più specifico di '%', quindi se si tenta di connettersi tramite localhost con un utente che ha accesso solo a '%', la voce localhost è più specifica, quindi mysql tenta di accedere a localhost, ma si aspetta un nome utente vuoto e password vuota. Poiché queste non sono le credenziali fornite, viene visualizzato l'errore di accesso negato. Rimuovendo queste voci, consente l'accesso per gli utenti a '%'.
Bstakes,

@bstakes il comportamento predefinito del client mysql è usare il nome utente della shell se non ne specifichi uno. la domanda ha un utente nell'esempio e nel messaggio di errore. ero curioso di sapere come un '' utente sarebbe in conflitto con un utente nominato. è '' un carattere jolly?
Steve Buzonas,

@SteveBuzonas '' funziona come un jolly rispetto a localhost. Dai documenti MySQL e mostrato in una risposta sopra che fa riferimento al valore predefinito che hai menzionato: "Poiché quella voce ha un valore Host 'localhost' che è più specifico di '%', viene utilizzata in preferenza alla nuova voce quando ci si connette da localhost ! La procedura corretta è quella di inserire una seconda voce con Host = 'localhost' e User = 'some_user', oppure eliminare la voce con Host = 'localhost' e User = ''. "
Bstakes,

4

La mia comprensione, e sono pronto ad essere corretto su questo, è che MySQL tratta localhost separatamente a%. cioè localhost non è incluso nel carattere jolly.


Gli esempi forniti in dev.mysql.com/doc/refman/5.1/en/connection-access.html mi portano a credere che questo potrebbe non essere accurato. Hai riferimenti altrimenti?
Warner,

La mia comprensione di questo argomento si basa sul fatto che altri hanno segnalato lo stesso problema, sia in forma scritta che verbale, e risolvendolo creando 2 utenti, usando "%" e "localhost". Tuttavia, non ricordo di averlo mai visto ufficialmente documentato.
John Gardeniers,

1
Questo sembra essere corretto almeno su Ubuntu 12.04 LTS
Dex

Quello che mi è successo è che avevo user@%e non ha funzionato fino a quando non l'ho incluso user@localhost. Poi ho visto la risposta stackoverflow.com/a/29421084/4850646 e ho capito che avevo un utente anonimo con host localhost. Ho rimosso tutti gli utenti anonimi e sono stato in grado di accedervi da localhostquell'utente, anche dopo averlo rimosso user@localhost (e lasciato solo user@%). Sembra che, poiché localhostè più specifico di %, prova prima l' localhostutente, anche se è un utente anonimo!
Lucas Basquerotto,

0

Hai corso flush privileges;dopo aver creato l'utente? In caso contrario, le modifiche agli utenti / autorizzazioni non saranno necessarie fino al riavvio del server.

Quindi, controlla di non avere una voce '%' @ 'localhost'.


4
l'uso di "create user" e "grant" cancella automaticamente i privilegi. Dovresti scaricare i privilegi solo se stai manipolando direttamente il database mysql.
Zoredache,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.