Ver Mensaje Individual
  #1 (permalink)  
Antiguo 19/12/2013, 11:14
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Revocar permisos en determinadas columnas

Hola, estoy buscando un poco de ayuda para trabajar en MySQL.

Antes de nada comento que tengo un contrato de alojamiento en un servidor con DirectAdmin para editar MySQL; junto con esto he creado una base de datos, una tabla y dos usuarios, a uno de los cuales quiero limitar el acceso a una columna de la tabla.

En DirectAdmin puedo asignar privilegios a los usuarios a nivel de base de datos, hay una lista de operaciones (SELECT, UPDATE, CREATE, etc...) con un combo con Si/No. De esta forma habilito (por ejemplo) la operacion SELECT de ese usuario para toda la base de datos a la que pertenece.

Ahora viene el problema: mi intento es limitar la operacion SELECT de ese usuario un solo campo de la tabla de la base de datos. Para hacerlo he provado a revocerle el permiso pero me ha dado error porque no había un permiso explicito para ese campo en esa tabla:

Código MySQL:
Ver original
  1. REVOKE SELECT(campo) ON bdd.tabla FROM 'user'@'localhost' IDENTIFIED BY 'pass';
  2. #1147 - There is no such grant defined for user 'user' on host 'localhost' on table 'tabla'

Entiendo que eso significa que el SELECT(campo) no existia en la tabla de privilegios a nivel de columna, por eso no la encontró ni pudo eliminarla.

Luego he probado a darle privilegio de SELECT(campo) para luego poder quitarselo:

Código MySQL:
Ver original
  1. GRANT SELECT(campo) ON bdd.tabla TO 'user'@'localhost' IDENTIFIED BY 'pass';
  2. REVOKE SELECT(campo) ON bdd.tabla FROM 'user'@'localhost' IDENTIFIED BY 'pass';

Estas dos se ejecutan con exito pero no tienen efecto (el usuario sigue teniendo SELECT para el campo revocado); me parece entender que al tener el privilegio SELECT a nivel de base de datos entonces el REVOKE SELECT(campo) no tiene efecto porque el usuario sigue teniendo SELECT para toda la base de datos.

Entonces se me ocurrió la ultima idea (que tampoco funciona): voy al DirectAdmin y quito el privilegio SELECT el usuario para esa base de datos; eso implica que ese usuario no puede hacer SELECT ni de ninguna tabla ni de ninguna columna. Ahora voy a MySQL y intento darle SELECT para el campo que quiero que sea visible:

Código MySQL:
Ver original
  1. GRANT SELECT(campo_visible) ON bdd.tabla TO 'user'@'localhost' IDENTIFIED BY 'pass';
  2. #1142 - SELECT command denied to user 'user'@'localhost' for table 'tabla'

Eso significa que me cancela la solicitud porque no tiene permisos de SELECT en la base de datos? Es decir, ya que cancelé la operacion SELECT ¿me da un error porque la detecta en la query? Pero si le doy permisos de select en la bdd luego no me contempla las restricciones a nivel de columna. Si esto es así, entonces ¿como podria revocar privilegios a una columna en concreto?

Otro dato: el acceso que tengo a MySQL se limita a la tabla 'information_schema' (solo lectura) y a todas las que haya creado yo (todos los privilegios), pero no a la tabla 'mysql'. No se si eso tendrá alguna importancia. El caso es que llevo varios dias dandole vueltas al caso y no doy con la solución. Alguna idea? O alguna orientación? Ni que sean algunas palabras de animo tambien me vendrian bien :)

Mil gracias por adelantado y saludos
vosk