sql >> Database >  >> RDS >> Mysql

Kolomrechten toepassen voor een tabel via een trigger

Het korte antwoord:geef uw gebruikers geen directe toegang tot de database. Ze mogen nooit verbinding kunnen maken. Alleen de mensen die verantwoordelijk zijn voor onderhoud en operaties mogen toegang hebben tot de productiedatabase. Dit is om veiligheidsredenen. In bijna alle gevallen waarin informatie in een database is opgeslagen, is er een applicatie die alle toegang beheert, de daadwerkelijke updates uitvoert en de bedrijfslogica afdwingt die u kiest.

Combineer gegevens niet met bedrijfslogica.

Er zijn enkele databasesystemen, zoals Oracle, die uitblinken in het verhuren van uw winkel en het toepassen van veel van uw bedrijfslogica in de database zelf. Dit is echter voor een ander type toepassing en een andere benadering van het bouwen van systemen.

MySQL heeft niet al die tools om dit zo gemakkelijk te maken. Geloof me als ik je vertel dat je jezelf voorbereidt op een onderhoudsnachtmerrie als je je applicatielogica probeert te schrijven in triggers en opgeslagen procedures en views, en je gebruikers vervolgens directe toegang tot de database geeft.

Wanneer was de laatste keer dat u directe toegang tot de database kreeg toen u zich ergens voor aanmeldde? Twitter, Netflix, Groupon, Facebook -- u werkt met een webtoepassing die de bedrijfsregels toepast en namens u gegevens leest en schrijft in de database.

Er zijn tal van tools die het schrijven van uw applicatiesoftware gemakkelijker maken:debugging, profilering, broncontrole voor code en gezamenlijke ontwikkeling, unit-testing, continue integratie en implementatietools. Als je alles in de database probeert te schrijven, raak je dat allemaal kwijt.

Hier is een snel voorbeeld van hoe dit zou werken:

Structureer uw machtigingssysteem in drie tabellen:gebruiker, groep, gebruikersgroep. De gebruiker heeft de gebruikersaccounts in uw systeem, de groep heeft de verschillende toegangsniveaus zoals "admin", "client", "anoniem", enz. Met groepen wijst u toegangsniveaus toe aan gebruikers.

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

Nu enkele groepen definiëren

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

En een gebruiker, voeg ze dan toe aan de beheerdersgroep:

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

Nu zegt dit machtigingsmodel dat een gebruiker tot een of meer beveiligingsgroepen kan behoren. Uw aanvraag zou die groepen controleren en verschillende acties uitvoeren op basis van de resultaten. Laten we eens wat pseudo-code zien:

Laad de groepen van een gebruiker:

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
 }

In uw toepassing heeft u nu misschien een functie om de gegevens te bekijken, maar deze zou verschillende resultaten opleveren, afhankelijk van de gebruikersgroepen:

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

Evenzo moeten uw functies om gegevens te wijzigen controleren of de gebruikers toestemming hebben om dingen te wijzigen.




  1. Laravel-migratie zelfverwijzend extern sleutelprobleem

  2. Hoe gefilterde indexen een krachtigere functie kunnen zijn

  3. cross-app xml-query presteert exponentieel slechter naarmate xml-document groeit

  4. Database subsetting – Hoe in IRI Voracity