Mysql
 sql >> Base de données >  >> RDS >> Mysql

Application des autorisations de colonne pour une table sur un déclencheur

La réponse courte :ne donnez pas à vos utilisateurs un accès direct à la base de données. Ils ne devraient jamais pouvoir se connecter. Seules les personnes responsables de la maintenance et des opérations doivent avoir accès à la base de données de production. C'est pour des raisons de sécurité. Dans presque tous les cas où des informations sont stockées dans une base de données, il existe une application qui contrôle tous les accès, gère les mises à jour réelles et applique la logique métier que vous choisissez.

Ne mélangez pas les données avec la logique métier.

Il existe certains systèmes de base de données, tels qu'Oracle, qui excellent pour laisser votre magasin et appliquer une grande partie de votre logique métier à l'intérieur de la base de données elle-même. Cependant, il s'agit d'un type d'application différent et d'une approche différente des systèmes de construction.

MySQL n'a pas tous ces outils pour rendre cela aussi facile. Faites-moi confiance quand je vous dis que vous vous préparez à un cauchemar de maintenance si vous essayez d'écrire la logique de votre application dans des déclencheurs, des procédures stockées et des vues, puis donnez à vos utilisateurs un accès direct à la base de données.

À quand remonte la dernière fois où vous avez eu un accès direct à la base de données lorsque vous vous êtes inscrit à quelque chose ? Twitter, Netflix, Groupon, Facebook :vous interagissez avec une application Web qui applique les règles commerciales et lit et écrit des données dans la base de données en votre nom.

De nombreux outils facilitent l'écriture de votre application :débogage, profilage, contrôle de code source et développement collaboratif, tests unitaires, outils d'intégration continue et de déploiement. Si vous essayez de tout écrire dans la base de données, vous perdrez tout cela.

Voici un exemple rapide de la façon dont cela fonctionnerait :

Structurez votre système d'autorisations en trois tables :utilisateur, groupe, groupe_utilisateur. L'utilisateur détient les comptes d'utilisateurs dans votre système, le groupe détient les différents niveaux d'accès tels que "admin", "client", "anonyme", etc. Les groupes vous permettent d'attribuer des niveaux d'accès aux utilisateurs.

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

Maintenant pour définir quelques groupes

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

Et un utilisateur, puis ajoutez-le au groupe admin :

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

Désormais, ce modèle d'autorisations indique qu'un utilisateur peut appartenir à un ou plusieurs groupes de sécurité. Votre application vérifiera ces groupes et effectuera différentes actions en fonction des résultats. Voyons un pseudo-code :

Charger les groupes d'un utilisateur :

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
 }

Maintenant, dans votre application, vous pourriez avoir une fonction pour afficher les données, mais cela produirait des résultats différents selon les groupes d'utilisateurs :

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

De même, vos fonctions de modification des données doivent vérifier que les utilisateurs disposent des autorisations nécessaires pour modifier les éléments.