it-swarm.it

Concedere i privilegi di tabella a un utente che si connette da qualsiasi host

Ho un account utente - chiamiamolo "wordpress" - che devo consentire di accedere ad alcune tabelle del catalogo in un altro database e-commerce sullo stesso server. Ho configurato l'utente con tre maschere host da cui è consentito connettersi: "localhost", l'indirizzo IP del server Web e il nome host del server Web. Nessun problema lì.

L'utente 'wordpress' ha anche pieno accesso al proprio database, concesso tramite la sezione Privilegi dello schema in MySQL Workbench. Qui mostra che l'host è '%', che è quello che voglio, dal momento che non voglio gestire tre serie duplicate di privilegi per lo stesso utente. Se guardo in mysql.db, vedo questi privilegi, con '%' nella colonna Host.

Quindi ora voglio concedere l'autorizzazione SELECT su una manciata di tabelle in un altro database: chiamiamolo 'store'. Quindi provo questo:

GRANT SELECT ON store.catalog TO 'wordpress'@'%';

E ottengo "Impossibile trovare alcuna riga corrispondente nella tabella utente", per l'ovvia ragione che "%" non è una maschera host da cui ho esplicitamente consentito una connessione per questo particolare utente. Quindi qual è la sintassi corretta per concedere un privilegio di tabella a un utente da una qualsiasi delle maschere Host consentite? In che modo MySQL Workbench se la cava con i privilegi di schema? Non devo inserire manualmente le righe in mysql.tables_priv, vero?

UPDATE : Per chiarire, ecco come appaiono le tabelle utente/concessione correnti. Ho anonimizzato alcuni nomi, ovviamente. Si noti che l'host nella tabella dei privilegi dello schema è '%', ma non ci sono utenti con quell'host. Come posso ottenere MySQL per consentirmi di farlo con le sovvenzioni di oggetti schema? Preferibilmente senza andare in giro direttamente in mysql.tables_priv, ma lo farò se si riduce ad esso.

mysql> SELECT user, Host FROM mysql.user WHERE user = 'wordpress';
+-----------+-----------+
| user      | Host      |
+-----------+-----------+
| wordpress | 10.0.0.22 |
| wordpress | webserver |
| wordpress | localhost |
+-----------+-----------+
3 rows in set (0.00 sec)

mysql> SELECT user, Host, db, select_priv FROM mysql.db WHERE User = 'wordpress';
+-----------+------+----------------+-------------+
| user      | Host | db             | select_priv |
+-----------+------+----------------+-------------+
| wordpress | %    | wordpress      | Y           |
| wordpress | %    | wordpress_test | Y           |
+-----------+------+----------------+-------------+
2 rows in set (0.00 sec)

mysql> SHOW GRANTS FOR 'wordpress'@'localhost';
+---------------------------------------------------------------------------+
| Grants for [email protected]                                            |
+---------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'wordpress'@'localhost' IDENTIFIED BY PASSWORD '--' |
+---------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SHOW GRANTS FOR 'wordpress'@'%';
ERROR 1141 (42000): There is no such grant defined for user 'wordpress' on Host '%'

MySQL Workbench sta facendo qualcosa di orribilmente non documentato con i privilegi di schema/oggetto? Solo per i calci, ho concesso alcuni privilegi di tabella a una delle specifiche combinazioni utente @ Host, quindi ho aggiornato mysql.tables_priv per cambiare l'host in '%'. Dopo aver eseguito FLUSH PRIVILEGES, ha funzionato perfettamente. Strano.

6
db2

Quando esegui GRANT SELECT ON store.catalog TO 'wordpress'@'%';, mysqld vuole inserire una riga nella tabella delle sovvenzioni mysql.tables_priv. Ecco mysql.tables_priv:

mysql> show create table mysql.tables_priv\G
*************************** 1. row ***************************
       Table: tables_priv
Create Table: CREATE TABLE `tables_priv` (
  `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
  `Db` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
  `User` char(16) COLLATE utf8_bin NOT NULL DEFAULT '',
  `Table_name` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
  `Grantor` char(77) COLLATE utf8_bin NOT NULL DEFAULT '',
  `Timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `Table_priv` set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view','Trigger') CHARACTER SET utf8 NOT NULL DEFAULT '',
  `Column_priv` set('Select','Insert','Update','References') CHARACTER SET utf8 NOT NULL DEFAULT '',
  PRIMARY KEY (`Host`,`Db`,`User`,`Table_name`),
  KEY `Grantor` (`Grantor`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Table privileges'
1 row in set (0.00 sec)

mysql>

Poiché desideri inserire una riga in mysql.table_priv dove user = 'wordpress' e Host = '%', deve esistere una riga in mysql.user dove user = 'wordpress' e Host = '%'.

Hai anche detto che stai usando MySQL Workbench. Devi utilizzare 'root'@'localhost'. Di solito avrebbe tutti i diritti e una password.

Se vuoi solo consentire SELECT anonimo su quella tabella, esegui prima questo:

GRANT USAGE ON *.* TO 'wordpress'@'%';

Questo metterà [email protected]'%' in mysql.user. Successivamente, GRANT SELECT ON store.catalog TO 'wordpress'@'%' dovrebbe funzionare bene.

Dovrai vedere quali altri wordpress voci sono in mysql.user. Questo dovrebbe mostrare quali comandi SQL GRANT sono necessari:

SELECT CONCAT('GRANT SELECT ON store.catalog TO ',userhost,';') GrantCommand
FROM
(
    SELECT CONCAT('''',user,'''@''',Host,'''') userhost
    FROM mysql.user WHERE user='wordpress'
) A;
3
RolandoMySQLDBA

Questo ha funzionato per me usando la riga di comando (non workbench):

mysql> GRANT SELECT ON foo.bar TO 'wordpress'@'%';
Query OK, 0 rows affected (0.07 sec)

mysql> SHOW GRANTS FOR [email protected]'%';
+------------------------------------------------+
| Grants for [email protected]%                         |
+------------------------------------------------+
| GRANT USAGE ON *.* TO 'wordpress'@'%'          |
| GRANT SELECT ON `foo`.`bar` TO 'wordpress'@'%' |
+------------------------------------------------+
2 rows in set (0.05 sec)

Ho cercato e trovato questo bug report . Quale versione è il tuo Workbench? Sembra che abbiano una soluzione, ma non essendo un utente di Workbench, non conosco il loro controllo delle versioni (la versione corrente dovrebbe essere corretta).

Anche se non lo è, la soluzione è eseguirla attraverso la riga di comando!

2
Derek Downey