sql >> Base de Datos >  >> RDS >> Mysql

Aplicar permisos de columna para una tabla sobre un disparador

La respuesta corta:no dé a sus usuarios acceso directo a la base de datos. Nunca deberían poder conectarse. Solo las personas responsables del mantenimiento y las operaciones deben tener acceso a la base de datos de producción. Esto es por razones de seguridad. En casi todos los casos en los que la información se almacena en una base de datos, hay una aplicación que controla todos los accesos, se encarga de hacer las actualizaciones reales y hace cumplir la lógica empresarial que elija.

No mezcle datos con lógica empresarial.

Hay algunos sistemas de bases de datos, como Oracle, que se destacan por permitir que su tienda almacene y aplique gran parte de su lógica comercial dentro de la base de datos misma. Sin embargo, esto es para un tipo diferente de aplicación y un enfoque diferente para construir sistemas.

MySQL no tiene todas esas herramientas para hacer esto tan fácil. Confía en mí cuando te digo que te estás preparando para una pesadilla de mantenimiento si intentas escribir la lógica de tu aplicación en disparadores y procedimientos almacenados y vistas, y luego das a tus usuarios acceso directo a la base de datos.

¿Cuándo fue la última vez que se le dio acceso directo a la base de datos cuando se registró para algo? Twitter, Netflix, Groupon, Facebook:está interactuando con una aplicación basada en web que aplica las reglas comerciales y lee y escribe datos en la base de datos en su nombre.

Hay muchas herramientas que facilitan la escritura de su software de aplicación:depuración, creación de perfiles, control de fuente para código y desarrollo colaborativo, pruebas unitarias, integración continua y herramientas de implementación. Si intenta escribir todo en la base de datos, perderá todo eso.

He aquí un ejemplo rápido de cómo funcionaría esto:

Estructure su sistema de permisos en tres tablas:usuario, grupo, grupo_usuario. El usuario tiene las cuentas de usuario en su sistema, el grupo tiene varios niveles de acceso, como "administrador", "cliente", "anónimo", etc. Los grupos son la forma en que asigna niveles de acceso a los usuarios.

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

Ahora para definir algunos grupos

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

Y un usuario, luego agréguelo al grupo de administración:

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

Ahora bien, este modelo de permisos dice que un usuario puede pertenecer a uno o más grupos de seguridad. Su aplicación verificaría esos grupos y realizaría diferentes acciones en función de los resultados. Veamos algo de psuedo-código:

Cargue los grupos de un usuario:

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
 }

Ahora, en su aplicación, es posible que tenga una función para ver los datos, pero producirá diferentes resultados según los grupos de usuarios:

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

Del mismo modo, sus funciones para modificar datos deben verificar que los usuarios tengan permisos para cambiar cosas.