Tutorial Belajar MySQL Part 35: Cara Mengalihkan Hak Akses User MySQL (GRANT OPTION)

Dalam tutorial MySQL ini, kita akan membahas cara mengalihkan/memberikan hak akses dari seorang user MySQL ke user lainnya. Untuk keperluan ini MySQL menyediakan perintah GRANT OPTION.


Pengertian Hak Akses GRANT OPTION

Ada kalanya seorang user MySQL ingin mengalihkan hak akses yang ia miliki ke user lainnya.

Misalkan mahasiswa ilkom sudah dirasa terlalu banyak, sehingga user ilkom_admin1 membutuhkan admin baru untuk membantunya. User ilkom_admin1 bisa saja mengalihkan hak akses yang dimilikinya (tanpa mengapus hak akses sendiri) ke user ilkom_admin2.

Kemampuan untuk memberikan hak akses inilah yang disebut dengan hak GRANT OPTION. Tetapi syarat untuk seorang user dapat mengalihkan hak aksesnya adalah sewaktu pembuatan user asal, user root harus memberikan hak GRANT OPTION.


Cara Penggunaan dan Penulisan query GRANT OPTION (1)

Terdapat beberapa cara penulisan GRANT OPTION. Cara pertama yaitu menuliskan GRANT OPTION secara terpisah dengan hak akses. Cara ini digunakan jika user telah ada dan hak akses telah diberikan.

Format dasar penulisan GRANT OPTION:

GRANT GRANT OPTION ON nama_database.nama_tabel TO 'nama_user'@'lokasi_user';
  • GRANT OPTION adalah perintah yang dituliskan jika kita mengizinkan user tersebut bisa memberikan hak akses kepada user lainnya.
  • nama_database adalah nama database yang ingin diberikan hak akses. Jika kita mengizinkan user tersebut dapat mengakses semua database yang ada, nama_database bisa ditulis dengan tanda bintang (*).
  • nama_tabel adalah nama tabel yang ingin diberikan hak akses. Jika kita mengizinkan user dapat menggunakan semua  tabel, nama_tabel bisa ditulis dengan tanda bintang (*).
  • nama_user adalah nama dari user yang akan diberikan hak akses.
  • lokasi_user adalah alamat IP dari user yang ingin diberikan hak akses.

Sebagai contoh latihan, saya akan membuat user ilkom_admin1 dengan hak GRANT OPTION, lalu memberikan akses tersebut ke user ilkom_admin2.

Untuk langkah awal, saya akan masuk sebagai root dan membuat user ilkom_admin1 dengak hak akses query SELECT pada tabel mahasiswa_ilkom, lalu memberikan hak akses GRANT OPTION untuk user ilkom_admin1. Berikut query yang digunakan:

D:\MySQL\bin>mysql -uroot -pqwerty

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1

Server version: 5.5.27 MySQL Community Server (GPL)
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> CREATE USER 'ilkom_admin1'@'localhost' IDENTIFIED by 'r4hasia';
Query OK, 0 rows affected (0.04 sec)

mysql> GRANT SELECT ON universitas.mahasiswa_ilkom TO
'ilkom_admin1'@'localhost';
Query OK, 0 rows affected (0.14 sec)

mysql> GRANT GRANT OPTION ON universitas.mahasiswa_ilkom
TO 'ilkom_admin1'@'localhost';
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW GRANTS FOR ilkom_admin1@localhost \G

*************************** 1. row ***************************
Grants for ilkom_admin1@localhost: GRANT USAGE ON *.*
TO 'ilkom_admin1'@'localhost' IDENTIFIED BY PASSWORD 
'*7438236BE048F242AA18D2EE074296F078CD701A'

*************************** 2. row ***************************
Grants for ilkom_admin1@localhost: GRANT SELECT ON
`universitas`.`mahasiswa_ilkom` TO 'ilkom_admin1'@'localhost'
WITH GRANT OPTION
2 rows in set (0.00 sec)

Perhatikan pada baris setelah saya membuat user ilkom_admin1 (baris ke-14) dan hak akses SELECT (baris ke-17). Pada baris ke-21 saya memberikan perintah GRANT OPTION untuk user ilkom_admin1. Lalu pada baris ke 25 saya menggunakan menggunakan query SHOW GRANTS FOR untuk memeriksa hak akses ilkom_admin1, dan seperti yang terlihat pada baris ke-35, ada tambahan penjelasan pada user ilkom_admin1 'WITH GRANT OPTION'.

Jika anda mencoba masuk sebagai user ilkom_admin1, user tersebut dapat melihat isi seluruh tabel mahasiswa_ilkom. Untuk mencoba memberikan hak akses yang sama kepada user ilkom_admin2, pertama-tama dari user root kita akan membuat user ilkom_admin2. Berikut querynya:

mysql> CREATE USER 'ilkom_admin2'@'localhost' IDENTIFIED by 'r4hasia';
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW GRANTS FOR ilkom_admin2@localhost \G

*************************** 1. row ***************************
Grants for ilkom_admin2@localhost: GRANT USAGE ON *.* 
TO 'ilkom_admin2'@'localhost' IDENTIFIED BY PASSWORD 
'*7438236BE048F242AA18D2EE074296F078CD701A'
1 row in set (0.00 sec)

Perintah diatas digunakan untuk membuat user ilkom_admin2 tanpa hak akses, karena kita akan memberikan hak aksesnya melalui user ilkom_admin1. Untuk mencoba hak GRANT OPTION ini, keluarlah dari root, dan masuk sebagai ilkom_admin1.

mysql> exit;
Bye

D:\MySQL\bin>mysql -uilkom_admin1 -pr4hasia

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2

Server version: 5.5.27 MySQL Community Server (GPL)
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| universitas        |
+--------------------+
2 rows in set (0.10 sec)

mysql> USE universitas;
Database changed

mysql> SELECT * FROM mahasiswa_ilkom;
+-----------+-----------------+------+--------------+------+
| nim       | nama            | umur | tempat_lahir | IPK  |
+-----------+-----------------+------+--------------+------+
| 089045001 | Andi Suryo      |   23 | Jakarta      | 2.70 |
| 109245021 | Santi Syanum    |   21 | Malang       | 3.20 |
| 099145055 | Neil Situmorang |   22 | Medan        | 1.90 |
| 129245021 | Ginara Maulida  |   22 | Malang       | 3.80 |
+-----------+-----------------+------+--------------+------+
4 rows in set (0.12 sec)

mysql> GRANT SELECT ON universitas.mahasiswa_ilkom TO
 'ilkom_admin2'@'localhost';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT INSERT ON universitas.mahasiswa_ilkom TO
'ilkom_admin2'@'localhost';

ERROR 1142 (42000): INSERT command denied to user
'ilkom_admin1'@'localhost' for table 'mahasiswa_ilkom'

Setelah masuk sebagai user ilkom_admin1 (baris ke-4), saya menjalankan beberapa query untuk mengecek hak akses ilkom_admin1 dengan perintah SELECT pada tabel mahasiswa_ilkom (baris ke-17 dan 29). Terlihat bahwa user ilkom_admin1 dapat menjalankan perintah SELECT tersebut tanpa masalah.

Pada baris ke 40 dan 44 saya menjalankan perintah GRANT untuk meneruskan hak akses SELECT kepada user ilkom_admin2. Baris 40 berjalan sukses karena user ilkom_admin1 memiliki hak akses GRANT OPTION untuk query SELECT.

Namun perintah pada baris ke 44, menghasilkan error karena user ilkom_admin1 tidak memiliki hak akses untuk perintah INSERT, sehingga tidak bisa meneruskan hak aksesnya kemapa user ilkom_admin2.

Sebagai langkah terakhir, saya akan mencoba masuk dengan user ilkom_admin2 untuk testing perintah SELECT yang didapat dari user ilkom_admin1.

mysql> exit
Bye

D:\MySQL\bin>mysql -uilkom_admin2 -pr4hasia

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5

Server version: 5.5.27 MySQL Community Server (GPL)
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| universitas        |
+--------------------+
2 rows in set (0.00 sec)

mysql> USE universitas;
Database changed

mysql> SELECT * FROM mahasiswa_ilkom;
+-----------+-----------------+------+--------------+------+
| nim       | nama            | umur | tempat_lahir | IPK  |
+-----------+-----------------+------+--------------+------+
| 089045001 | Andi Suryo      |   23 | Jakarta      | 2.70 |
| 109245021 | Santi Syanum    |   21 | Malang       | 3.20 |
| 099145055 | Neil Situmorang |   22 | Medan        | 1.90 |
| 129245021 | Ginara Maulida  |   22 | Malang       | 3.80 |
+-----------+-----------------+------+--------------+------+
4 rows in set (0.00 sec)

Seperti yang diharapkan, user ilkom_admin2 dapat menjalankan perintah SELECT yang diberikan oleh user ilkom_admin1.


Cara Penggunaan dan Penulisan query GRANT OPTION (2)

Selain format penulisan GRANT OPTION yang diberikan pada perintah terpisah setelah membuat user dan hak aksesnya seperti contoh sebelumnya, MySQL memiliki cara kedua dengan menyatukannya penulisan GRANT OPTION dengan pemberian hak akses.

Berikut adalah format dasar penulisannya:

GRANT hak_akses ON nama_database.nama_tabel TO 'nama_user'@'lokasi_user' with GRANT OPTION;

Perhatikan bahwa penambahan kata WITH GRANT OPTION pada bagian akhir perintah.

Sebagai contoh, saya akan membuat user ekonomi_admin1 dengan hak akses ALL PRIVILEGES pada tabel mahasiswa_ekonomi dengan hak GRANT OPTION.

D:\MySQL\bin>mysql -uroot -pqwerty

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6

Server version: 5.5.27 MySQL Community Server (GPL)
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> CREATE USER 'ekonomi_admin1'@'localhost' IDENTIFIED by 'r4hasia';
Query OK, 0 rows affected (0.01 sec)

mysql> GRANT ALL ON universitas.mahasiswa_ekonomi TO
'ekonomi_admin1'@'localhost' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW GRANTS FOR ekonomi_admin1@localhost \G

*************************** 1. row ***************************
Grants for ekonomi_admin1@localhost: GRANT USAGE ON *.*
TO 'ekonomi_admin1'@'localhost' IDENTIFIED BY PASSWORD
'*7438236BE048F242AA18D2EE074296F078CD701A'

*************************** 2. row ***************************
Grants for ekonomi_admin1@localhost: GRANT ALL PRIVILEGES ON
`universitas`.`mahasiswa_ekonomi` TO 'ekonomi_admin1'@'localhost'
WITH GRANT OPTION
2 rows in set (0.00 sec)

Dari query diatas, saya menggabungkan query pemberian hak akses dengan pemberian GRANT OPTION. Sebagai latihan, anda bisa meneruskan membuat user ekonomi_admin2, dan memberikan hak akses ALL dari user ekonomi_admin1.

Hak GRANT OPTION sebaiknya diberikan dengan hati-hati. Karena sifatnya yang dapat meneruskan hak akses kepada orang lain, perintah GRANT OPTION bisa digunakan dengan cara yang diluar prediksi. User yang seharusnya tidak memiliki akses untuk tabel tertentu, bisa saja tiba-tiba menambahkan data baru pada tabel tersebut karena mendapat hak akses dari user lainnya.

Namun pada kasus-kasus tertentu, hak akses GRANT OPTION memberikan fleksibilitas yang tinggi dalam merancang database.


Selanjutnya kita akan membahas cara MySQL menyimpan password user, pada tutorial Pengertian Fungsi Hashing dan Cara MySQL Menyimpan Password.

Add Comment