Tutorial Belajar MySQL Part 31: Cara Membuat Hak Akses (Privileges) User MySQL (GRANT)

Jika pada Tutorial Cara Membuat dan Menghapus User MySQL, kita telah belajar cara membuat user, pada tutorial kali ini kita akan mempelajari cara untuk membuat dan memberikan hak akses kepada user tersebut dengan query GRANT.

Hak akses dalam MySQL selain dibatasi dengan query apa saja yang dibolehkan, juga dapat dibatasi pada level dimana query tersebut akan dijalankan, misalkan pada level database, level tabel atau level kolom. Kita akan membahasnya secara lengkap pada tutorial kali ini.

Secara sekilas, kita telah membahas tentang pengertian hak akses (privileges) pada artikel Tutorial Belajar MySQL: Mengenal Superuser root dan Pengertian Privileges MySQL.

Dalam perancangan aplikasi yang membutuhkan database, setiap user yang akan mengakses database seharusnya memiliki batasan masing-masing sesuai dengan fungsinya. Sebagai contoh, pada database universitas yang telah kita buat, terdapat 2 buah tabel, yakni mahasiswa_ilkom dan mahasiswa_ekonomi.

Misalkan kita membuat user mahasiswa. User mahasiswa ini hanya diberikan hak akses untuk melihat-lihat data tabel mahasiswa_ilkom dan mahasiswa_ekonomi, namun tidak bisa merubah apapun di dalam tabel tersebut. Di dalam MySQL, user mahasiswa ini hanya kita berikan hak akses SELECT.

Contoh lainnya, untuk keperluan administrasi, user ilkom_admin sebagai administrator akan diberikan hak akses untuk dapat menginput data dan merubah data dari tabel mahasiswa_ilkom. Tetapi , user ilkom_admin tidak bisa melihat dan merubah tabel mahasiswa_ekonomi, karena hak akses itu seharusnya diberikan kepada ekonomi_admin.

Dari contoh ini kita dapat melihat perlunya membatasi hak akses untuk masing-masing user: user mahasiswa, user ilkom_admin, dan user ekonomi_admin.

Saya akan menggunakan contoh database universitas yang telah dibuat pada Tutorial Cara Membuat dan Menghapus User MySQL, jika anda ingin mengikuti contoh yang tersedia, silahkan buat database tersebut terlebih dahulu.

Cara Memberikan Hak Akses Kepada User dengan query GRANT

Untuk memberikan hak akses kepada sebuah user, MySQL menyediakan query GRANT. Berikut format dasar query GRANT:

GRANT hak_akses ON nama_database.nama_tabel TO 'nama_user'@'lokasi_user';
  • hak_akses adalah privileges yang akan berikan kepada user tersebut. Hak akses disini berisi query yang diperbolehkan, seperti: SELECT, INSERT, UPDATE, DELETE, atau query lainnya. Jika kita ingin memberikan hak penuh untuk semua query dasar tersebut, hak_akses ini bisa diisi dengan ALL.
  • 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 penggunaan query GRANT, misalkan kita ingin memberikan privileges kepada ilkom_admin untuk dapat melihat (melakukan query SELECT) pada tabel mahasiswa_ilkom yang berada pada database universitas, maka berikut query yang kita gunakan:

mysql> CREATE USER 'ilkom_admin'@'localhost' IDENTIFIED BY 'r4hasia';
Query OK, 0 rows affected (0.52 sec)

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

Query diatas terdiri dari 2 bagian, pada bagian pertama kita membuat user ilkom_admin yang harus diakses dari komputer localhost (komputer yang sama dengan server MySQL berada), dan memberikan password 'r4hasia'. Cara membuat user telah kita bahas pada tutorial sebelumnya, Cara Membuat dan Menghapus User MySQL (CREATE USER).

Selanjutnya pada bagian kedua, kita memberikan hak akses dengan query GRANT pada untuk user ilkom_admin.

Perhatikan cara penulisan query GRANT tersebut, setelah keyword GRANT, diikuti dengan kata SELECT. SELECT disini adalah hak akses yang ingin di berikan kepada user, saya memberikan hak SELECT karena user admin saat ini hanya dapat melakukan perintah SELECT.

Setelah SELECT, diikuti dengan penulisan tabel yang diperbolehkan, yakni universitas.mahasiswa_ilkom (dibaca:tabel mahasiswa_ilkom pada database universitas). Bagian terakhir adalah user yang akan diberikan hak aksesnya, yakni ilkom_admin pada localhost.

Untuk mencoba user ilkom_admin, keluarlah dari root, dan masuk sebagai ilkom_admin:

D:\MySQL\bin>mysql -u ilkom_admin -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.00 sec)

mysql> USE universitas;
Database changed

mysql> SHOW TABLES;
+-----------------------+
| Tables_in_universitas |
+-----------------------+
| mahasiswa_ilkom       |
+-----------------------+
1 row in set (0.00 sec)

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 |
+-----------+-----------------+------+--------------+------+
3 rows in set (0.07 sec)

mysql> DELETE FROM mahasiswa_ilkom WHERE nama="Andi Suryo";
ERROR 1142 (42000): DELETE command denied to user
'ilkom_admin'@'localhost' fortable 'mahasiswa_ilkom'

mysql> DROP TABLE mahasiswa_ilkom;
ERROR 1142 (42000): DROP command denied to user
'ilkom_admin'@'localhost' for table 'mahasiswa_ilkom'

Dari contoh query diatas, dapat dilihat bahwa pada saat ilkom_admin menjalankan perintah SHOW TABLES, ia hanya dapat melihat satu tabel, yakni tabel mahasiswa_ilkom. Padahal dalam database tersebut kita juga telah membuat tabel mahasiswa_ekonomi, namun karena hak akses yang diberikan, ilkom_admin hanya dapat melihat tabel yang diperbolehkan.

Setelah menampilkan isi tabel mahasiswa_ilkom,  user ilkom_admin mencoba menghapus tabel mahasiswa_ilkom. Tetapi karena kita membatasi hak aksesnya, ilkom_admin tidak dapat menjalankan query DELETE dan DROP, dan akan langsung ditolak oleh MySQL.


Cara Memberikan Hak Akses Untuk Seluruh Tabel

Sebagai contoh kedua, kali ini kita akan membuat user mahasiswa yang diberikan hak akses untuk dapat melihat seluruh tabel yang ada pada database universitas, berikut querynya:

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

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

Pembuatan user mahasiswa ini hampir sama dengan perintah saat membuat user ilkom_admin. Kecuali kali ini untuk penulisan tabel kita menggunakan format universitas.* yang berarti dapat mengakses seluruh tabel pada database universitas.

Selanjutnya, kita akan mencoba menggunakan user mahasiswa untuk melihat database universitas:

D:\MySQL\bin>mysql -u mahasiswa -pr4hasia

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

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> USE universitas;
Database changed

mysql> SHOW TABLES;
+-----------------------+
| Tables_in_universitas |
+-----------------------+
| mahasiswa_ekonomi     |
| mahasiswa_ilkom       |
+-----------------------+
2 rows in set (0.00 sec)

Dari hasil query diatas, terlihat bahwa user mahasiswa dapat melihat terdapat 2 tabel dalam database universitas. Dan jika kita membuat sebuah tabel baru dalam database universitas, user mahasiswa juga akan bisa melihatnya.


Cara Memberikan Seluruh Hak Akses (query GRANT ALL)

Dari kedua contoh user sebelumnya, yakni user ilkom_admin dan mahasiswa, kita hanya menggunakan hak akses SELECT. Kali ini kita akan memberikan hak akses penuh kepada user ekonomi_admin, dengan query GRANT ALL. Berikut querynya:

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

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

Dengan memberikan hak akses GRANT ALL, maka user ekonomi_admin dapat menggunakan seluruh query dasar pada tabel mahasiswa_ekonomi, seperti SELECT, UPDATE, bahkan DELETE. Sebagai latihan, silahkan mencoba masuk sebagai user ekonomi_admin dan lakukan perintah seperti UPDATE, DELETE, dan DROP.


Cara Memberikan Hak Akses MySQL Pada Level Kolom

Untuk keperluan yang lebih spesifik, hak akses dapat juga dibatasi hanya untuk kolom tertentu. Hal ini bisa didasarkan bahwa terdapat sebuah kolom yang dirasakan rahasia, dan tidak boleh diketahui user tersebut.

Misalkan kita membuat user tamu_ilkom yang hanya dapat melihat nama dan umur mahasiswa pada tabel mahasiswa_ilkom, dan merahasiakan kolom lainnya seperti alamat dan IPK, maka berikut querynya:

mysql> CREATE USER 'tamu_ilkom'@'localhost';
Query OK, 0 rows affected (0.00 sec)

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

Perhatikan cara penulisan kolom yang diberikan hak aksesnya, setelah hak akses (dalam contoh adalah SELECT), penulisan nama kolom harus berada dalam tanda kurung. Dapat dilihat bahwa kita memberikan hak akses hanya pada kolom nama dan umur untuk tabel mahasiswa_ilkom.

Untuk mengujinya, masuklah sebagai user tamu_ilkom:

D:\MySQL\bin>mysql -u tamu_ilkom

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

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> USE universitas;
Database changed

mysql> SHOW TABLES;
+-----------------------+
| Tables_in_universitas |
+-----------------------+
| mahasiswa_ilkom       |
+-----------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM mahasiswa_ilkom;
ERROR 1143 (42000): SELECT command denied to user 'tamu'@'localhost' 
for column 'nim' in table 'mahasiswa_ilkom'

mysql> SELECT nama,umur FROM mahasiswa_ilkom;
+-----------------+------+
| nama            | umur |
+-----------------+------+
| Andi Suryo      |   23 |
| Santi Syanum    |   21 |
| Neil Situmorang |   22 |
+-----------------+------+
3 rows in set (0.00 sec)

Pada saat user tamu_ilkom mencoba menampilkan seluruh kolom dengan query SELECT * FROM mahasiswa_ilkom, MySQL akan mengeluarkan error karena user tamu_ilkom hanya memiliki hak akses untuk kolom nama dan umur saja, dimana pada saat menggunakan perintah SELECT nama,umur FROM mahasiswa_ilkom, MySQL menampilkannya dengan baik.


 

Dari tutorial Cara Membuat Hak Akses (Privileges) User MySQL dengan query GRANT ini, kita telah mempelajari cara memberikan hak akses untuk user. Hak akses itu sendiri sebenarnya dapat dibatasi pada 4 tingkatan level, yakni level global, level database, level tabel, dan level kolom. Pada tutorial diatas, kita telah mencoba level database, tabel dan kolom, namun untuk lebih dalam, kita akan membahasnya pada tutorial MySQL selanjutnya: Membahas Jenis-jenis Hak Akses dalam MySQL.

25 Comments

  1. sahrun nawawi
    14 Nov 14
    • Andre
      16 Nov 14
  2. pepep11
    03 Mar 15
    • Andre
      03 Mar 15
  3. billy
    25 Mar 15
    • Andre
      27 Mar 15
  4. Andre
    19 Jun 16
    • Andre
      20 Jun 16
  5. ihya
    24 Jun 16
    • Andre
      25 Jun 16
  6. Arya
    14 May 17
  7. Arya
    14 May 17
  8. Rasid Azis
    10 Jan 18
    • Francis
      15 Aug 18
  9. AHN
    02 Apr 18
  10. Benhur
    26 Aug 18
    • Andre
      26 Aug 18
  11. Arif Julkarnaen
    17 Sep 19
    • Arif Julkarnaen
      17 Sep 19
      • Arif Julkarnaen
        17 Sep 19
        • Andre
          17 Sep 19
  12. Rexor
    26 Sep 19
    • Andre
      26 Sep 19
  13. Ibeng
    10 Nov 20
  14. candra
    27 Sep 21

Add Comment