Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Anwenden von Spaltenberechtigungen für eine Tabelle über einen Trigger

Die kurze Antwort:Geben Sie Ihren Benutzern keinen direkten Zugriff auf die Datenbank. Sie sollten niemals in der Lage sein, eine Verbindung herzustellen. Nur die für Wartung und Betrieb verantwortlichen Personen sollten Zugriff auf die Produktionsdatenbank haben. Dies aus Sicherheitsgründen. In fast allen Fällen, in denen Informationen in einer Datenbank gespeichert werden, gibt es eine Anwendung, die den gesamten Zugriff steuert, die eigentlichen Aktualisierungen durchführt und die von Ihnen gewählte Geschäftslogik durchsetzt.

Mischen Sie Daten nicht mit Geschäftslogik.

Es gibt einige Datenbanksysteme, wie z. B. Oracle, die sich dadurch auszeichnen, dass Sie einen Großteil Ihrer Geschäftslogik in der Datenbank selbst speichern und anwenden können. Dies gilt jedoch für eine andere Art von Anwendung und einen anderen Ansatz zum Erstellen von Systemen.

MySQL verfügt nicht über all diese Tools, um dies so einfach zu machen. Vertrauen Sie mir, wenn ich Ihnen sage, dass Sie sich auf einen Wartungsalptraum einstellen, wenn Sie versuchen, Ihre Anwendungslogik in Trigger und gespeicherte Prozeduren und Ansichten zu schreiben und Ihren Benutzern dann direkten Zugriff auf die Datenbank zu gewähren.

Wann haben Sie das letzte Mal direkten Zugriff auf die Datenbank erhalten, wenn Sie sich für etwas angemeldet haben? Twitter, Netflix, Groupon, Facebook – Sie interagieren mit einer webbasierten Anwendung, die die Geschäftsregeln anwendet und Daten in Ihrem Namen in die Datenbank liest und schreibt.

Es gibt viele Tools, die das Schreiben Ihrer Anwendungssoftware erleichtern:Debugging, Profiling, Quellcodeverwaltung für Code und kollaborative Entwicklung, Unit-Tests, Continuous Integration und Deployment-Tools. Wenn Sie versuchen, alles in die Datenbank zu schreiben, verlieren Sie all das.

Hier ist ein kurzes Beispiel dafür, wie das funktionieren würde:

Strukturieren Sie Ihr Berechtigungssystem in drei Tabellen:user, group, user_group. Benutzer hält die Benutzerkonten in Ihrem System, Gruppe hält die verschiedenen Zugriffsebenen wie "admin", "client", "anonym" usw. Mit Gruppen weisen Sie Benutzern Zugriffsebenen zu.

`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;`

Jetzt einige Gruppen definieren

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

Und einen Benutzer, dann fügen Sie ihn der Admin-Gruppe hinzu:

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

Dieses Berechtigungsmodell besagt nun, dass ein Benutzer einer oder mehreren Sicherheitsgruppen angehören kann. Ihre Anwendung würde nach diesen Gruppen suchen und basierend auf den Ergebnissen verschiedene Aktionen ausführen. Sehen wir uns etwas Pseudo-Code an:

Laden Sie die Gruppen eines Benutzers:

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
 }

Jetzt haben Sie in Ihrer Anwendung möglicherweise eine Funktion zum Anzeigen der Daten, die jedoch je nach Benutzergruppe zu unterschiedlichen Ergebnissen führt:

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();
   }
}

Ebenso sollten Ihre Funktionen zum Ändern von Daten überprüfen, ob die Benutzer berechtigt sind, Dinge zu ändern.