Crea un nuovo utente in MySQL e concedi l'accesso completo a un database


628

Voglio creare un nuovo utente in MySQL e dargli pieno accesso a un solo database, per esempio dbTest, che creo con un comando simile create database dbTest;. Quali sarebbero i comandi MySQL per farlo?

Risposte:


829

Prova questo per creare l'utente:

CREATE USER 'user'@'hostname';

Prova questo per dargli accesso al database dbTest:

GRANT ALL PRIVILEGES ON dbTest.* To 'user'@'hostname' IDENTIFIED BY 'password';

Se stai eseguendo il codice / sito accedendo a MySQL sulla stessa macchina, il nome host sarebbe localhost.

Ora, la rottura.

GRANT - Questo è il comando utilizzato per creare utenti e concedere diritti a database, tabelle, ecc.

ALL PRIVILEGES- Questo dice che l'utente avrà tutti i privilegi standard. Questo non include il privilegio di usare il comando GRANT comunque.

dbtest.*- Queste istruzioni MySQL per applicare questi diritti per l'uso nell'intero database dbtest. Se lo si desidera, è possibile sostituire * con nomi di tabella specifici o routine di archiviazione.

TO 'user'@'hostname'- "utente" è il nome utente dell'account utente che si sta creando. Nota: devi avere le virgolette singole. 'hostname' dice a MySQL da quali host l'utente può connettersi. Se lo desideri solo dalla stessa macchina, usalocalhost

IDENTIFIED BY 'password' - Come avresti intuito, questo imposta la password per quell'utente.


82
Se si consente l'accesso alla rete e si desidera una connessione da qualsiasi host, è possibile modificare "nomehost" in "%". Ad esempio, ... TO 'dbuser' @ '%' IDENTIFICATO ... '%' è il carattere jolly dell'host.
Physicsmichael,

17
Non dimenticare di svuotare i privilegi quando lavori su utenti e tabelle! :-)
corsiKa

31
Questo ha funzionato per me: CREATE USER 'user1' @ 'localhost' IDENTIFICATO DA 'password'; CONCEDERE TUTTI I PRIVILEGI SU db_database1. * A 'user1' @ 'localhost' IDENTIFICATO DA 'password'; PRIVILEGI DI FLUSH;
Mohamad Fakih,

4
@DanMcGrath: la clausola IDENTIFICATA DA 'password' è obbligatoria, se l'utente esiste già e ha una password?
nanosoft,

8
L'utilizzo di GRANT per creare un nuovo utente verrà rimosso nelle versioni future di MySQL (è obsoleto al momento della stesura di questo). In futuro dovrà essere fatto con due chiamate, CREA UTENTE e poi CONCESSIONE.
Darren Felton,

325

Sintassi

Per creare l'utente in MySQL / MariaDB 5.7.6 e versioni successive, utilizzare la CREATE USERsintassi :

CREATE USER 'new_user'@'localhost' IDENTIFIED BY 'new_password';

quindi per concedere tutto l'accesso al database (ad es. my_db), utilizzare GRANTSintassi , ad es

GRANT ALL ON my_db.* TO 'new_user'@'localhost';

Dove ALL( tipo_priv ) può essere sostituito con particolare privilegio, come SELECT, INSERT, UPDATE, ALTER, etc.

Quindi per ricaricare le autorizzazioni appena assegnate eseguire:

FLUSH PRIVILEGES;

Esecuzione

Per eseguire i comandi sopra, è necessario eseguire il mysqlcomando e digitarli nel prompt, quindi disconnettersi dal quitcomando o Ctrl- D.

Per eseguire dalla shell, utilizzare il -eparametro (sostituire SELECT 1con uno dei comandi sopra):

$ mysql -e "SELECT 1"

oppure stampa la dichiarazione dallo standard input:

$ echo "FOO STATEMENT" | mysql

Se hai accesso negato con sopra, specifica i parametri -u(per utente) e -p(per password) oppure, per un accesso a lungo termine, imposta le tue credenziali ~/.my.cnf, ad es.

[client]
user=root
password=root

Integrazione con la shell

Per le persone che non hanno familiarità con la sintassi di MySQL, qui ci sono utili funzioni della shell che sono facili da ricordare e usare (per usarle, è necessario caricare le funzioni della shell incluse più in basso).

Ecco un esempio:

$ mysql-create-user admin mypass
| CREATE USER 'admin'@'localhost' IDENTIFIED BY 'mypass'

$ mysql-create-db foo
| CREATE DATABASE IF NOT EXISTS foo

$ mysql-grant-db admin foo
| GRANT ALL ON foo.* TO 'admin'@'localhost'
| FLUSH PRIVILEGES

$ mysql-show-grants admin
| SHOW GRANTS FOR 'admin'@'localhost'
| Grants for admin@localhost                                                                                   
| GRANT USAGE ON *.* TO 'admin'@'localhost' IDENTIFIED BY PASSWORD '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4' |
| GRANT ALL PRIVILEGES ON `foo`.* TO 'admin'@'localhost'

$ mysql-drop-user admin
| DROP USER 'admin'@'localhost'

$ mysql-drop-db foo
| DROP DATABASE IF EXISTS foo

Per utilizzare i comandi sopra, è necessario copiare e incollare le seguenti funzioni nel file rc (ad es. .bash_profile) E ricaricare la shell o il file sorgente. In questo caso basta digitare source .bash_profile:

# Create user in MySQL/MariaDB.
mysql-create-user() {
  [ -z "$2" ] && { echo "Usage: mysql-create-user (user) (password)"; return; }
  mysql -ve "CREATE USER '$1'@'localhost' IDENTIFIED BY '$2'"
}

# Delete user from MySQL/MariaDB
mysql-drop-user() {
  [ -z "$1" ] && { echo "Usage: mysql-drop-user (user)"; return; }
  mysql -ve "DROP USER '$1'@'localhost';"
}

# Create new database in MySQL/MariaDB.
mysql-create-db() {
  [ -z "$1" ] && { echo "Usage: mysql-create-db (db_name)"; return; }
  mysql -ve "CREATE DATABASE IF NOT EXISTS $1"
}

# Drop database in MySQL/MariaDB.
mysql-drop-db() {
  [ -z "$1" ] && { echo "Usage: mysql-drop-db (db_name)"; return; }
  mysql -ve "DROP DATABASE IF EXISTS $1"
}

# Grant all permissions for user for given database.
mysql-grant-db() {
  [ -z "$2" ] && { echo "Usage: mysql-grand-db (user) (database)"; return; }
  mysql -ve "GRANT ALL ON $2.* TO '$1'@'localhost'"
  mysql -ve "FLUSH PRIVILEGES"
}

# Show current user permissions.
mysql-show-grants() {
  [ -z "$1" ] && { echo "Usage: mysql-show-grants (user)"; return; }
  mysql -ve "SHOW GRANTS FOR '$1'@'localhost'"
}

Nota: se si preferisce non lasciare traccia (come le password) nella cronologia di Bash, selezionare: Come impedire che i comandi vengano visualizzati nella cronologia di bash?


1
Devi creare l'utente e concedere i privilegi separatamente? Ho scoperto che il comando grant sembra creare l'utente stesso, almeno guardando nella tabella mysql.user sembra così.
Tim

@CreativityKills Funzionerà con la password se le aggiungi nel tuo ~/.my.cnfcome suggerito sopra.
Kenorb,

lasciare tracce della password nella cronologia della shell non è una grande idea
dmirkitanov

@dmirkitanov Puoi impedirlo aggiungendo uno spazio, vedi: Come impedire che i comandi vengano visualizzati nella cronologia di bash?
Kenorb,

58

Per creare un utente e concedere tutti i privilegi su un database.

Accedi a MySQL:

mysql -u root

Ora crea e concedi

GRANT ALL PRIVILEGES ON dbTest.* To 'user'@'hostname' IDENTIFIED BY 'password';

Utente anonimo (solo per test locali)

In alternativa, se si desidera solo consentire l'accesso completo e senza restrizioni a un database (ad es. Sul proprio computer locale per un'istanza di prova, è possibile concedere l'accesso all'utente anonimo, in questo modo:

GRANT ALL PRIVILEGES ON dbTest.* To ''@'hostname'

Sii consapevole

Questo va bene per i dati spazzatura in fase di sviluppo. Non farlo con qualsiasi cosa ti interessi.


3
Puoi creare un utente anonimo come quello, ma non farlo! Non ci sono buoni motivi per avere un utente con tutti i privilegi e nessuna password, ma potrebbe rovinarti un giorno / anno / affari / lavoro un giorno se qualcuno ottenga l'accesso al tuo server che non dovrebbe avere. Perché rendere qualsiasi altra cosa più facile per loro?
Luke Cousins,

2
Se qualcuno ha ottenuto l'accesso remoto al mio macbook, ho più cose di cui preoccuparmi rispetto al contenuto del mio database di sviluppo. Dovrei ripetere l'iterazione, questo è solo per i test locali, non farlo con dati reali.
superluminario,

4
Esattamente, con tutte quelle altre cose di cui preoccuparsi, non preoccuparti anche dei contenuti del tuo database di sviluppo. Il tuo database di sviluppo potrebbe (probabilmente avrà) frammenti di dati di database live (ad es. Per replicare un bug) che dovrebbero essere fatti tutti gli sforzi per proteggersi. Semplicemente non è necessario avere accesso al database senza password. Non risparmia nemmeno tempo. Non vale la seccatura potenziale.
Luke Cousins,

1
Forse. Nel mio caso sono dati spazzatura, vivrò con il rischio.
superluminario,

17
$ mysql -u root -p -e "grant all privileges on dbTest.* to
`{user}`@`{host}` identified by '{long-password}'; flush privileges;"

ignora l' opzione -p , se l'utente mysql non ha password o premi semplicemente il pulsante "[Enter]" per by-pass. le stringhe circondate da parentesi graffe devono essere sostituite con valori effettivi.


13

È possibile creare nuovi utenti utilizzando l' istruzione CREATE USER e concedere loro i diritti tramite GRANT .


CREA UTENTE 'jeffrey' @ 'localhost' IDENTIFICATO DA 'mypass';
CGL

6

Per me questo ha funzionato.

CREATE USER 'spowner'@'localhost' IDENTIFIED BY '1234'; 
GRANT ALL PRIVILEGES ON test.* To 'spowner'@'localhost'; 
FLUSH PRIVILEGES;

dove

  • spowner: nome utente
  • 1234: password dello spowner
  • test: il database 'spowner' ha accesso a

2

Il comando seguente funzionerà se si desidera creare un nuovo utente, dandogli tutto l'accesso a un database specifico (non tutti i database nel tuo Mysql) sul tuo host locale.

GRANT ALL PRIVILEGES ON test_database.* TO 'user'@'localhost' IDENTIFIED BY 'password';

Ciò garantirà tutti i privilegi di un database test_database(nel tuo caso dbTest) a quell'utente su localhost.

Controlla quali autorizzazioni quel comando sopra ha emesso per quell'utente eseguendo il comando seguente.

SHOW GRANTS FOR 'user'@'localhost'

Per ogni evenienza, se si desidera limitare l'accesso dell'utente a una sola tabella

GRANT ALL ON mydb.table_name TO 'someuser'@'host';

Errore di sintassi e un errore di battitura nella prima riga, "PRIVILEGES ON 'test_datase'" non dovrebbe contenere virgolette, dovrebbe avere il ". *" Dopo di esso, ad esempio test_datase. *, Ed è un refuso, dovrebbe essere "test_database ".
Brettins,

0

Nel caso in cui la hostparte venga omessa, per impostazione predefinita viene visualizzato il simbolo jolly %, consentendo a tutti gli host.

CREATE USER 'service-api';

GRANT ALL PRIVILEGES ON the_db.* TO 'service-api' IDENTIFIED BY 'the_password'

SELECT * FROM mysql.user;
SHOW GRANTS FOR 'service-api'
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.