Inicio Foros Bases de datos MySQL Asignar permisos a un usuario solo a tablas concretas en MySQL

Viendo 6 entradas - de la 1 a la 6 (de un total de 6)
  • Autor
    Entradas
  • #3458
    Varios
    Moderador

    Hola, tengo una base de datos MySQL montada en un servidor Linux CentOS 7. Tiene bastantes tablas y quiero darle a un usuario permisos de lectura (select) solo a unas tablas concretas, no a todas.

    Lo he intentado desde MySQL Workbench pero solo me deja establecer los permisos a nivel de catálogo (base de datos) y no de tabla:

    Permisos usuario en MySQL con Workbench

    ¿Es que MySQL no permite establecer permisos a un usuario por tabla?

    #3460
    alonsojpd
    Superadministrador

    Te indicamos los pasos para crear un usuario y establecerle permisos a nivel de tabla en MySQL. Puedes hacerlo desde la línea de comandos de tu servidor Linux CentOS con MySQL:

    1. Conéctate a MySQL con el comando:

    2. Crea el usuario con el comando:

    3. Con esta consulta puedes comprobar que el usuario se ha creado correctamente:

    4. Para establecer permisos para una tabla concreta, por ejemplo el permiso de solo lectura (select) e incluso desde un equipo concreto de la red (por ejemplo desde todos los que tengan IP 192.168.1.*):

    Donde:

    • nombre_usuario: nombre que quieras darle al usuario con el que accederás a MySQL. Si queremos dar acceso para todos los usuarios (no es recomendable) colocaremos un *.
    • nombre_bd: nombre de la base de datos (catálogo) que contiene las tablas a las que le darás acceso. Si queremos dar acceso a todas las bases de datos (no es recomendable) colocaremos un *.
    • nombre_tabla: nombre de la tabla a la que le darás acceso. Si queremos dar acceso a todas las bases de datos (no es recomendable) colocaremos un *.
    • select: indica el tipo de permiso que le darás para la tabla, hay varias opciones y se pueden añadir juntas (separadas por comas): insert, select, update, delete, drop,… Si queremos todos los permisos (no suele ser recomendable) se pone un ALL.
    • 192.168.1.%: en este valor estableceremos desde que IP o rango de IP queremos que se acceda a MySQL con el usuario. Si queremos todos (no suele ser recomendable) se pone un %.

    Para comprobar que se han asignado correctamente los permisos puedes ejecutar este otro comando:

    Por último ejecuta esta otra consulta para hacer efectivos permisos creados:

    A partir de este momento el usuario tendrá acceso de lectura (select) para la tabla indicada en la base de datos MySQL indicada y desde el equipo o equipos indicados.

    #3461
    Varios
    Moderador

    Genial, lo he probado y me funciona perfecto.

    Otra cuestión ¿hay algún listado de esos permisos que se le pueden asignar select, insert, update, …?

    #3462
    alonsojpd
    Superadministrador

    Aquí tienes un listado con su descripción (en inglés):

    • ALL [PRIVILEGES] Grant all privileges at specified access level except GRANT OPTION and PROXY.
    • ALTER Enable use of ALTER TABLE. Levels: Global, database, table.
    • ALTER ROUTINE Enable stored routines to be altered or dropped. Levels: Global, database, routine.
      CREATE Enable database and table creation. Levels: Global, database, table.
    • CREATE ROLE Enable role creation. Level: Global.
    • CREATE ROUTINE Enable stored routine creation. Levels: Global, database.
    • CREATE TABLESPACE Enable tablespaces and log file groups to be created, altered, or dropped. Level: Global.
    • CREATE TEMPORARY TABLES Enable use of CREATE TEMPORARY TABLE. Levels: Global, database.
    • CREATE USER Enable use of CREATE USER, DROP USER, RENAME USER, and REVOKE ALL PRIVILEGES. Level: Global.
    • CREATE VIEW Enable views to be created or altered. Levels: Global, database, table.
      DELETE Enable use of DELETE. Level: Global, database, table.
    • DROP Enable databases, tables, and views to be dropped. Levels: Global, database, table.
    • DROP ROLE Enable roles to be dropped. Level: Global.
    • EVENT Enable use of events for the Event Scheduler. Levels: Global, database.
    • EXECUTE Enable the user to execute stored routines. Levels: Global, database, routine.
    • FILE Enable the user to cause the server to read or write files. Level: Global.
    • GRANT OPTION Enable privileges to be granted to or removed from other accounts. Levels: Global, database, table, routine, proxy.
    • INDEX Enable indexes to be created or dropped. Levels: Global, database, table.
    • INSERT Enable use of INSERT. Levels: Global, database, table, column.
    • LOCK TABLES Enable use of LOCK TABLES on tables for which you have the SELECT privilege. Levels: Global, database.
    • PROCESS Enable the user to see all processes with SHOW PROCESSLIST. Level: Global.
    • PROXY Enable user proxying. Level: From user to user.
    • REFERENCES Enable foreign key creation. Levels: Global, database, table, column.
    • RELOAD Enable use of FLUSH operations. Level: Global.
    • REPLICATION CLIENT Enable the user to ask where master or slave servers are. Level: Global.
    • REPLICATION SLAVE Enable replication slaves to read binary log events from the master. Level: Global.
    • SELECT Enable use of SELECT. Levels: Global, database, table, column.
    • SHOW DATABASES Enable SHOW DATABASES to show all databases. Level: Global.
    • SHOW VIEW Enable use of SHOW CREATE VIEW. Levels: Global, database, table.
    • SHUTDOWN Enable use of mysqladmin shutdown. Level: Global.
    • SUPER Enable use of other administrative operations such as CHANGE MASTER TO, KILL, PURGE BINARY   LOGS, SET GLOBAL, and mysqladmin debug command. Level: Global.
    • TRIGGER Enable trigger operations. Levels: Global, database, table.
    • UPDATE Enable use of UPDATE. Levels: Global, database, table, column.
    • USAGE Synonym for “no privileges”
    #41685
    MarioG
    Participante

    Hola!
    Tengo desconocimeinto, de algo similar al caso aqui comentado.
    Mi caso es querer que un usuario (o varios segun se incluyan) se conecten a dos bases de datos.
    Lo he hecho así (desde codigo):
    GRANT ALL PRIVILEGES ON db1.* TO mariog@’%’ IDENTIFIED BY ‘mipasw’ WITH GRANT OPTION
    GRANT ALL PRIVILEGES ON db1.* TO mariog@’%’ IDENTIFIED BY ‘mipasw’ WITH GRANT OPTION
    FLUSH PRIVILEGES

    La consulta es si en una sola expresión se pueden incluir ambas DB.
    He probado (por desconocimiento) asi:
    GRANT ALL PRIVILEGES ON db1.*,db2.* TO mariog@’%’ IDENTIFIED BY ‘mipasw’ WITH GRANT OPTION
    Y obviamente no es l forma.
    Se puede?; como?

    muchas gracias

    #41686
    MarioG
    Participante

    Corrijo; corresponde:
    GRANT ALL PRIVILEGES ON db2.* TO mariog@’%’ IDENTIFIED BY ‘mipasw’ WITH GRANT OPTION

Viendo 6 entradas - de la 1 a la 6 (de un total de 6)
  • Debes estar registrado para responder a este debate.