Buat pengguna baru di MySQL dan berikan akses penuh ke satu basis data

628

Saya ingin membuat pengguna baru di MySQL dan memberikan akses penuh hanya ke satu database, katakanlah dbTest, yang saya buat dengan perintah seperti create database dbTest;. Apa yang akan menjadi perintah MySQL untuk melakukan itu?

jimgh
sumber

Jawaban:

829

Coba ini untuk membuat pengguna:

CREATE USER 'user'@'hostname';

Coba ini untuk memberikannya akses ke database dbTest:

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

Jika Anda menjalankan kode / situs yang mengakses MySQL pada mesin yang sama, nama host adalah localhost.

Sekarang, kerusakannya.

GRANT - Ini adalah perintah yang digunakan untuk membuat pengguna dan memberikan hak ke database, tabel, dll.

ALL PRIVILEGES- Ini memberi tahu pengguna akan memiliki semua hak istimewa standar. Namun ini tidak termasuk hak istimewa untuk menggunakan perintah GRANT.

dbtest.*- Instruksi ini MySQL untuk menerapkan hak-hak ini untuk digunakan di seluruh basis data dbtest. Anda dapat mengganti * dengan nama tabel tertentu atau menyimpan rutinitas jika diinginkan.

TO 'user'@'hostname'- 'pengguna' adalah nama pengguna akun pengguna yang Anda buat. Catatan: Anda harus memiliki tanda kutip tunggal di sana. 'hostname' memberi tahu MySQL dari host mana pengguna dapat terhubung. Jika Anda hanya menginginkannya dari mesin yang sama, gunakanlocalhost

IDENTIFIED BY 'password' - Seperti yang sudah Anda duga, ini menetapkan kata sandi untuk pengguna itu.

Dan McGrath
sumber
82
Jika Anda mengizinkan akses jaringan dan menginginkan koneksi dari host mana pun, Anda dapat mengubah 'hostname' menjadi '%'. Misalnya, ... TO 'dbuser' @ '%' IDENTIFIED ... '%' adalah wildcard host.
physicsmichael
17
Jangan lupa untuk menghapus hak istimewa saat Anda bekerja pada pengguna dan tabel! :-)
corsiKa
31
Ini berfungsi untuk saya: CREATE USER 'user1' @ 'localhost' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON db_database1. * Untuk 'user1' @ 'localhost' IDENTIFIEDED BY 'password'; PRIVILEGUS FLUSH;
Mohamad Fakih
4
@DanMcGrath: Apakah IDENTIFIKASI OLEH klausa 'kata sandi' wajib, jika pengguna sudah ada dan memiliki kata sandi?
nanosoft
8
Menggunakan GRANT untuk membuat pengguna baru akan dihapus di rilis MySQL yang akan datang (itu sudah ditinggalkan pada saat penulisan ini). Di masa depan itu harus dilakukan dengan dua panggilan, BUAT PENGGUNA lalu GRANT.
Darren Felton
325

Sintaksis

Untuk membuat pengguna di MySQL / MariaDB 5.7.6 dan lebih tinggi, gunakan CREATE USERsintaks :

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

lalu untuk memberikan semua akses ke database (mis. my_db), gunakan GRANTSintaks , mis

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

Mana ALL( priv_type ) bisa diganti dengan spesifik hak istimewa seperti SELECT, INSERT, UPDATE, ALTER, dll

Kemudian untuk memuat ulang izin yang baru ditugaskan jalankan:

FLUSH PRIVILEGES;

Mengeksekusi

Untuk menjalankan perintah di atas, Anda perlu menjalankan mysqlperintah dan mengetiknya ke prompt, lalu keluar dengan quitperintah atau Ctrl- D.

Untuk menjalankan dari shell, gunakan -eparameter (ganti SELECT 1dengan salah satu dari perintah di atas):

$ mysql -e "SELECT 1"

atau cetak pernyataan dari input standar:

$ echo "FOO STATEMENT" | mysql

Jika Anda mendapat akses ditolak dengan di atas, tentukan -u(untuk pengguna) dan -p(untuk kata sandi) parameter, atau untuk akses jangka panjang atur kredensial Anda ~/.my.cnf, misalnya

[client]
user=root
password=root

Integrasi shell

Bagi orang-orang yang tidak terbiasa dengan sintaks MySQL, berikut adalah fungsi-fungsi shell yang mudah diingat dan digunakan (untuk menggunakannya, Anda perlu memuat fungsi-fungsi shell yang disertakan lebih jauh ke bawah).

Berikut ini contohnya:

$ 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

Untuk menggunakan perintah di atas, Anda perlu menyalin & menempel fungsi-fungsi berikut ke file rc Anda (mis. .bash_profile) Dan memuat kembali shell Anda atau sumber file. Dalam hal ini ketik saja 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'"
}

Catatan: Jika Anda lebih suka untuk tidak meninggalkan jejak (seperti kata sandi) di riwayat Bash Anda, periksa: Bagaimana mencegah perintah muncul di riwayat bash?

kenorb
sumber
1
Apakah Anda perlu membuat pengguna dan memberikan hak secara terpisah? Saya telah menemukan bahwa perintah hibah tampaknya membuat pengguna itu sendiri, setidaknya mencari di tabel mysql.user terlihat seperti itu.
Tim
@CreativityKills Akan berfungsi dengan kata sandi jika Anda menambahkannya ke dalam ~/.my.cnfseperti yang disarankan di atas.
kenorb
meninggalkan jejak kata sandi dalam sejarah shell bukanlah ide yang bagus
dmirkitanov
@dmirkitanov Anda dapat mencegahnya dengan menambahkan spasi, lihat: Bagaimana mencegah perintah muncul di bash history?
kenorb
58

Untuk membuat pengguna dan memberikan semua hak istimewa pada database.

Masuk ke MySQL:

mysql -u root

Sekarang buat dan berikan

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

Pengguna anonim (hanya untuk pengujian lokal)

Sebagai alternatif, jika Anda hanya ingin memberikan akses penuh tanpa batas ke basis data (mis. Pada mesin lokal Anda untuk contoh uji, Anda dapat memberikan akses ke pengguna anonim, seperti:

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

Waspadalah

Ini bagus untuk data sampah dalam pengembangan. Jangan lakukan ini dengan apa pun yang Anda pedulikan.

superluminary
sumber
3
Anda dapat membuat pengguna anonim seperti itu, tetapi jangan! Tidak ada alasan yang baik untuk memiliki pengguna dengan hak istimewa penuh dan tanpa kata sandi, tetapi itu mungkin merusak Anda sehari / tahun / bisnis / pekerjaan satu hari jika seseorang mendapatkan akses ke server Anda yang tidak seharusnya. Mengapa membuat hal lain lebih mudah bagi mereka?
Luke Cousins
2
Jika seseorang telah mendapatkan akses jarak jauh ke macbook saya, saya memiliki lebih banyak hal yang perlu dikhawatirkan daripada isi basis data pengembangan saya. Saya harus mengulanginya, ini hanya untuk pengujian lokal, jangan lakukan ini dengan data nyata.
superluminary
4
Persis, dengan semua hal lain yang perlu dikhawatirkan, jangan khawatir tentang isi basis data dev Anda juga. Basis data dev Anda mungkin (mungkin akan) memiliki potongan data basis data langsung (misalnya untuk mereplikasi bug) yang setiap upaya harus dilakukan untuk menjaga keamanan. Tidak perlu memiliki akses basis data tanpa kata sandi. Bahkan tidak menghemat waktu. Tidak sebanding dengan potensi kerumitannya.
Luke Cousins
1
Mungkin. Dalam kasus saya ini adalah data sampah, saya akan hidup dengan risikonya.
superluminary
17
$ mysql -u root -p -e "grant all privileges on dbTest.* to
`{user}`@`{host}` identified by '{long-password}'; flush privileges;"

abaikan opsi -p , jika pengguna mysql tidak memiliki kata sandi atau cukup tekan tombol "[Enter]" untuk mem-by-pass. string yang dikelilingi oleh kurung kurawal perlu diganti dengan nilai aktual.

SK Venkat
sumber
13

Anda dapat membuat pengguna baru menggunakan pernyataan CREATE USER , dan memberikan hak kepada mereka menggunakan GRANT .

candiru
sumber
BUAT PENGGUNA 'jeffrey' @ 'localhost' diidentifikasi oleh 'mypass';
cgl
6

Bagi saya ini berhasil.

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

dimana

  • spowner: nama pengguna
  • 1234: kata sandi dari spowner
  • test: database 'spowner' memiliki hak akses ke
Park JongBum
sumber
2

Perintah di bawah ini akan berfungsi jika Anda ingin membuat pengguna baru memberinya semua akses ke database tertentu (tidak semua database di Mysql Anda) di localhost Anda.

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

Ini akan memberikan semua hak istimewa ke satu basis data test_database(dalam kasus Anda dbTest) kepada pengguna tersebut di localhost.

Periksa izin apa yang dikeluarkan oleh perintah di atas untuk pengguna tersebut dengan menjalankan perintah di bawah ini.

SHOW GRANTS FOR 'user'@'localhost'

Untuk jaga-jaga, jika Anda ingin membatasi akses pengguna hanya satu tabel

GRANT ALL ON mydb.table_name TO 'someuser'@'host';
Prabhakar Undurthi
sumber
Kesalahan sintaksis & salah ketik di baris pertama Anda, "PRIVILEGES ON 'test_datase'" seharusnya tidak memiliki tanda kutip, harus memiliki ". *" Setelahnya, misalnya, test_datase. *, Dan salah ketik, harus "test_database ".
Brettins
0

Dalam kasus hostbagian dihilangkan itu default ke simbol wildcard %, memungkinkan semua 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'
dummyDev
sumber