Erstellen Sie einen neuen Benutzer in MySQL und gewähren Sie ihm vollen Zugriff auf eine Datenbank

628

Ich möchte einen neuen Benutzer in MySQL erstellen und ihm vollen Zugriff nur auf eine Datenbank gewähren dbTest, beispielsweise mit einem Befehl wie create database dbTest;. Was wären die MySQL-Befehle, um das zu tun?

jimgh
quelle

Antworten:

829

Versuchen Sie dies, um den Benutzer zu erstellen:

CREATE USER 'user'@'hostname';

Versuchen Sie dies, um Zugriff auf die Datenbank zu erhalten dbTest:

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

Wenn Sie den Code / die Site, die auf MySQL zugreift, auf demselben Computer ausführen, lautet der Hostname localhost.

Nun ist der Zusammenbruch.

GRANT - Dies ist der Befehl zum Erstellen von Benutzern und zum Gewähren von Rechten für Datenbanken, Tabellen usw.

ALL PRIVILEGES- Dies sagt ihm, dass der Benutzer alle Standardrechte hat. Dies beinhaltet jedoch nicht das Privileg, den Befehl GRANT zu verwenden.

dbtest.*- Diese Anweisung MySQL, diese Rechte zur Verwendung in der gesamten dbtest-Datenbank anzuwenden. Wenn Sie möchten, können Sie das * durch bestimmte Tabellennamen oder Speicherroutinen ersetzen.

TO 'user'@'hostname'- 'Benutzer' ist der Benutzername des Benutzerkontos, das Sie erstellen. Hinweis: Sie müssen die einfachen Anführungszeichen dort haben. 'Hostname' teilt MySQL mit, von welchen Hosts aus der Benutzer eine Verbindung herstellen kann. Wenn Sie es nur von demselben Computer möchten, verwenden Sielocalhost

IDENTIFIED BY 'password' - Wie Sie vermutet haben, wird hiermit das Kennwort für diesen Benutzer festgelegt.

Dan McGrath
quelle
82
Wenn Sie den Netzwerkzugriff zulassen und eine Verbindung von einem beliebigen Host aus wünschen, können Sie 'Hostname' in '%' ändern. Beispiel: ... TO 'dbuser' @ '%' IDENTIFIED ... '%' ist der Host-Platzhalter.
Physikmichael
17
Vergessen Sie nicht, Berechtigungen zu löschen, wenn Sie an Benutzern und Tabellen arbeiten! :-)
corsiKa
31
Dies funktionierte für mich: CREATE USER 'user1' @ 'localhost' IDENTIFIED BY 'password'; GEWÄHRLEISTUNG FÜR ALLE PRIVILEGIEN AUF db_database1. * An 'user1' @ 'localhost' IDENTIFIED BY 'password'; SPÜLPRIVILEGIEN;
Mohamad Fakih
4
@DanMcGrath: Ist die IDENTIFIED BY-Kennwortklausel obligatorisch, wenn der Benutzer bereits vorhanden ist und ein Kennwort hat?
Nanosoft
8
Die Verwendung von GRANT zum Erstellen eines neuen Benutzers wird in zukünftigen Versionen von MySQL entfernt (es ist zum Zeitpunkt des Schreibens dieses Artikels veraltet). In Zukunft muss dies mit zwei Aufrufen erfolgen: CREATE USER, dann GRANT.
Darren Felton
325

Syntax

Verwenden Sie die folgende CREATE USERSyntax, um Benutzer in MySQL / MariaDB 5.7.6 und höher zu erstellen :

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

Um dann den gesamten Zugriff auf die Datenbank zu gewähren (z. B. my_db), verwenden Sie die GRANTSyntax , z

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

Wo ALL( priv_type ) kann mit speziellen Privilegien wie ersetzt werden SELECT, INSERT, UPDATE, ALTERetc.

Führen Sie dann die neu zugewiesenen Berechtigungen erneut aus:

FLUSH PRIVILEGES;

Ausführen

Um die obigen Befehle auszuführen, müssen Sie den mysqlBefehl ausführen und in die Eingabeaufforderung eingeben und sich dann mit dem quitBefehl oder Ctrl- abmelden D.

Verwenden Sie zum Ausführen von der Shell den -eParameter (durch SELECT 1einen der oben genannten Befehle ersetzen ):

$ mysql -e "SELECT 1"

oder drucken Sie die Anweisung von der Standardeingabe:

$ echo "FOO STATEMENT" | mysql

Wenn Ihnen der Zugriff oben verweigert wurde , geben Sie die Parameter -u(für Benutzer) und -p(für Kennwort) an oder legen Sie für den Langzeitzugriff Ihre Anmeldeinformationen fest ~/.my.cnf, z

[client]
user=root
password=root

Shell-Integration

Für Leute, die nicht mit der MySQL-Syntax vertraut sind, gibt es hier praktische Shell-Funktionen, die leicht zu merken und zu verwenden sind (um sie zu verwenden, müssen Sie die weiter unten enthaltenen Shell-Funktionen laden).

Hier ist ein Beispiel:

$ 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

Um die obigen Befehle zu verwenden, müssen Sie die folgenden Funktionen kopieren und in Ihre RC- Datei einfügen (z. B. .bash_profile) und Ihre Shell neu laden oder die Datei als Quelle verwenden. In diesem Fall geben Sie einfach Folgendes ein 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'"
}

Hinweis: Wenn Sie keine Spuren (z. B. Kennwörter) in Ihrem Bash-Verlauf hinterlassen möchten, überprüfen Sie: Wie kann verhindert werden, dass Befehle im Bash-Verlauf angezeigt werden?

Kenorb
quelle
1
Müssen Sie den Benutzer erstellen und Berechtigungen separat gewähren? Ich habe festgestellt, dass der Befehl grant den Benutzer selbst zu erstellen scheint, zumindest in der Tabelle mysql.user sieht es so aus.
Tim
@CreativityKills Funktioniert mit dem Passwort, wenn Sie es ~/.my.cnfwie oben vorgeschlagen zu Ihrem Passwort hinzufügen .
Kenorb
Spuren des Passworts in der Shell-Geschichte zu hinterlassen, ist keine gute Idee
Dmirkitanov
@dmirkitanov Sie können dies verhindern, indem Sie ein Leerzeichen hinzufügen. Weitere Informationen finden Sie unter: So verhindern Sie, dass Befehle im Bash-Verlauf angezeigt werden.
Kenorb
58

So erstellen Sie einen Benutzer und gewähren alle Berechtigungen für eine Datenbank.

Melden Sie sich bei MySQL an:

mysql -u root

Jetzt erstellen und gewähren

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

Anonymer Benutzer (nur für lokale Tests)

Wenn Sie nur uneingeschränkten uneingeschränkten Zugriff auf eine Datenbank gewähren möchten (z. B. auf Ihrem lokalen Computer für eine Testinstanz), können Sie dem anonymen Benutzer wie folgt Zugriff gewähren:

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

Sei vorsichtig

Dies ist in Ordnung für Junk-Daten in der Entwicklung. Mach das nicht mit irgendetwas, das dir wichtig ist.

überleuchtet
quelle
3
Sie können so einen anonymen Benutzer erstellen, aber nicht! Es gibt keinen guten Grund, einen Benutzer mit vollständigen Berechtigungen und ohne Kennwort zu haben, aber es könnte Sie eines Tages Tag / Jahr / Geschäft / Job ruinieren, wenn jemand Zugriff auf Ihren Server erhält, der dies nicht haben sollte. Warum ihnen etwas anderes leichter machen?
Luke Cousins
2
Wenn jemand Fernzugriff auf mein MacBook erhalten hat, muss ich mir mehr Sorgen machen als über den Inhalt meiner Entwicklungsdatenbank. Ich sollte es noch einmal wiederholen, dies ist nur für lokale Tests gedacht. Tun Sie dies nicht mit realen Daten.
Superluminary
4
Bei all den anderen Dingen, über die Sie sich Sorgen machen müssen, sollten Sie sich auch nicht um den Inhalt Ihrer Entwicklerdatenbank kümmern. Ihre Entwicklerdatenbank verfügt möglicherweise (wahrscheinlich) über Ausschnitte von Live-Datenbankdaten (z. B. zum Replizieren eines Fehlers), die alle Anstrengungen unternehmen sollten, um die Sicherheit zu gewährleisten. Es ist einfach kein Datenbankzugriff ohne Passwort erforderlich. Das spart nicht einmal Zeit. Den möglichen Aufwand nicht wert.
Luke Cousins
1
Vielleicht. In meinem Fall handelt es sich um Junk-Daten, ich werde mit dem Risiko leben.
Superluminary
17
$ mysql -u root -p -e "grant all privileges on dbTest.* to
`{user}`@`{host}` identified by '{long-password}'; flush privileges;"

Ignorieren Sie die Option -p , wenn der MySQL-Benutzer kein Passwort hat, oder drücken Sie einfach die "[Enter]" - Taste, um zu umgehen. Zeichenfolgen, die von geschweiften Klammern umgeben sind, müssen durch tatsächliche Werte ersetzt werden.

SK Venkat
quelle
13

Sie können neue Benutzer mit der Anweisung CREATE USER erstellen und ihnen mit GRANT Rechte erteilen .

Candiru
quelle
CREATE USER 'jeffrey' @ 'localhost' IDENTIFIZIERT DURCH 'mypass';
cgl
6

Für mich hat das funktioniert.

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

wo

  • spowner: Benutzername
  • 1234: Passwort des Besitzers
  • Test: Datenbank 'spowner' hat Zugriffsrecht auf
Park JongBum
quelle
2

Der folgende Befehl funktioniert, wenn Sie einen neuen Benutzer erstellen möchten, der ihm den gesamten Zugriff auf eine bestimmte Datenbank (nicht alle Datenbanken in Ihrem MySQL) auf Ihrem lokalen Host gewährt.

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

Dadurch werden diesem Benutzer auf localhost alle Berechtigungen für eine Datenbank test_database(in Ihrem Fall dbTest) gewährt .

Überprüfen Sie, welche Berechtigungen der obige Befehl diesem Benutzer erteilt hat, indem Sie den folgenden Befehl ausführen.

SHOW GRANTS FOR 'user'@'localhost'

Nur für den Fall, dass Sie den Benutzerzugriff auf nur eine einzige Tabelle beschränken möchten

GRANT ALL ON mydb.table_name TO 'someuser'@'host';
Prabhakar Undurthi
quelle
Syntaxfehler & ein Tippfehler in Ihrer ersten Zeile, die "PRIVILEGES ON 'test_datase'" sollten keine Anführungszeichen haben, sollten das ". *" Danach haben, z. B. test_datase. *, Und ein Tippfehler, sollte "test_database" sein ".
Brettins
0

Wenn das hostTeil weggelassen wird, wird standardmäßig das Platzhaltersymbol verwendet %, sodass alle Hosts zugelassen werden.

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'
dummyDev
quelle