Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Menerapkan izin kolom untuk tabel di atas pemicu

Jawaban singkatnya:jangan beri pengguna Anda akses langsung ke database. Mereka seharusnya tidak pernah bisa terhubung. Hanya orang yang bertanggung jawab untuk pemeliharaan dan operasi yang boleh memiliki akses ke database produksi. Ini untuk alasan keamanan. Di hampir setiap kasus di mana informasi disimpan dalam database, ada aplikasi yang mengontrol semua akses, menangani pembaruan aktual, dan menerapkan logika bisnis yang Anda pilih.

Jangan mencampur data dengan logika bisnis.

Ada beberapa sistem database, seperti Oracle yang unggul dalam membiarkan toko Anda dan menerapkan banyak logika bisnis Anda di dalam database itu sendiri. Namun, ini untuk jenis aplikasi yang berbeda, dan pendekatan yang berbeda untuk membangun sistem.

MySQL tidak memiliki semua alat tersebut untuk mempermudah melakukan hal ini. Percayalah ketika saya memberi tahu Anda bahwa Anda menyiapkan diri untuk mimpi buruk pemeliharaan jika Anda mencoba untuk menulis logika aplikasi Anda dalam pemicu dan prosedur dan tampilan tersimpan, lalu berikan pengguna Anda akses langsung ke database.

Kapan terakhir kali Anda diberi akses database langsung saat mendaftar untuk sesuatu? Twitter, Netflix, Groupon, Facebook -- Anda berinteraksi dengan aplikasi berbasis web yang menerapkan aturan bisnis serta membaca dan menulis data ke dalam database atas nama Anda.

Ada banyak alat yang membuat penulisan perangkat lunak aplikasi Anda lebih mudah:debugging, pembuatan profil, kontrol sumber untuk pengembangan kode dan kolaboratif, pengujian unit, integrasi berkelanjutan dan alat penyebaran. Jika Anda mencoba untuk menulis semuanya ke dalam database, Anda akan kehilangan semua itu.

Berikut adalah contoh singkat tentang cara kerjanya:

Susun sistem izin Anda sebagai tiga tabel:pengguna, grup, grup_pengguna. Pengguna memegang akun pengguna di sistem Anda, grup memegang berbagai tingkat akses seperti "admin", "klien", "anonim", dll. Grup adalah cara Anda menetapkan tingkat akses ke pengguna.

`CREATE TABLE `user` (
`user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`email` varchar(64) NOT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 CREATE TABLE `group` (
  `group_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(32) NOT NULL,
  PRIMARY KEY (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `user_group` (
  `user_id` int(10) unsigned NOT NULL,
  `group_id` int(10) unsigned NOT NULL,
  PRIMARY KEY (`user_id`,`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;`

Sekarang untuk menentukan beberapa grup

`insert into `group` (name) values ('admin'), ('user'), ('anonymous');`

Dan seorang pengguna, lalu tambahkan mereka ke grup admin:

`insert into user (email) values ('[email protected]');`
`insert into user_group (user_id,group_id) values (1,1);`

Sekarang model izin ini mengatakan bahwa pengguna dapat menjadi bagian dari satu atau lebih grup keamanan. Aplikasi Anda akan memeriksa grup tersebut dan melakukan tindakan yang berbeda berdasarkan hasil. Mari kita lihat beberapa psuedo-code:

Muat grup pengguna:

class User {

  private $user_id;
  private $groups;
  private $db;

  function load_groups() {
    // query the database
    $result = $db->query("SELECT name FROM `group` g JOIN user_group ug USING (group_id) WHERE user_id={$this->user_id}");
    // save an array of group names
    while ($row = $result->fetchrow()) {
      $this->groups[] = $row['name'];
    }
  }

  function is_member($group) {
    if (in_array($group, $this->groups) {
      return true;  // user group includes this value
    }
    return false;  // user is not in the group
 }

Sekarang di aplikasi Anda, Anda mungkin memiliki fungsi untuk melihat data, tetapi akan menghasilkan hasil yang berbeda tergantung pada grup pengguna:

function display_data($user_object) {
   display_basic_data();   // everyone sees the basic data
   if ($user_object->is_member('admin')) {  
     // if the user is an admin, then display bank data too
     display_bank_data();
   }
}

Demikian pula, fungsi Anda untuk mengubah data harus memverifikasi bahwa pengguna memiliki izin untuk mengubah sesuatu.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Di meja kerja MySQL apa nama pengguna/kata sandi untuk koneksi?

  2. MYSQL_ROOT_PASSWORD disetel tetapi mendapatkan Akses ditolak untuk pengguna 'root'@'localhost' (menggunakan kata sandi:YA) dalam wadah buruh pelabuhan

  3. Error 1046 No database Selected, bagaimana cara mengatasinya?

  4. Frekuensi penghitungan MySQL

  5. pengaturan sql_mode global di mysql