Concedere le autorizzazioni per le visualizzazioni, negare la selezione nelle tabelle


9

Ho un utente MySQL e voglio che visualizzi SOLO le visualizzazioni che desidero e non qualsiasi altra tabella nel database. Ho concesso a questo utente le autorizzazioni solo su determinate visualizzazioni come segue:

GRANT SHOW VIEW ON `myDatabase`.`awesome_view` TO 'thisUser'@'%'

Se faccio una show grants;dichiarazione posso vedere queste autorizzazioni solo come previsto. Tuttavia, vorrei che questo utente interrogasse SOLO le viste e non le tabelle correlate a queste viste, ma non riesco a trovare un modo per farlo. Sembra che se voglio che l'utente esegua una selezione nella vista, anche la selezione deve essere concessa per la tabella o sbaglio?

Se rifiuto l' selectistruzione nel resto delle tabelle e nella riga di comando provo a fare una selezione, ottengo quanto segue:

SELECT * FROM myDatabase.fordibenForYouTable;
ERROR 1142 (42000): SELECT command denied to user 'thisUser'@'localhost' for table 'fordibenForYouTable'

Questo è quello che voglio davvero, ma mi viene anche negato se seleziono i dati di visualizzazione.

Esiste un modo per rendere disponibili all'utente solo le visualizzazioni e non le tabelle?

Risposte:


6

Dovrai trattare la vista come una tabella. Lo information_schema lo fa già

Se corri

SELECT table_name FROM information_schema.tables
WHERE engine IS NULL;

ottieni tutte le opinioni.

Concedi SELECT alla vista all'utente come segue

GRANT SELECT ON `myDatabase`.`fordibenForYouTable` TO 'thisUser'@'localhost' ;

Una volta fatto ciò, dovresti avere l'accesso SELECT alla tabella.

Per essere sicuro, corri SHOW GRANTS FOR 'thisUser'@'localhost';

Dovresti anche essere in grado di vedere a quale accesso a livello di tabella è concesso 'thisUser'@'localhost'

SELECT * FROM mysql.tables_priv
WHERE user='thisUser' and host='localhost'\G

Puoi anche vedere a quale utente ha accesso a livello di tabella myDatabase.fordibenForYouTable

SELECT * FROM mysql.tables_priv
WHERE db='myDatabase' and table_name='fordibenForYouTable'\G

PROVACI !!!


Ehi, l'hai fatto! Grazie! Non sono riuscito a trovare la soluzione per me! Molte grazie!
Metafaniel,

5

So che ora è vecchio, ma ecco cosa ha risolto questo problema per me ...

La risposta è stata con la sintassi "SQL SECURITY".

la mia definizione di vista originale aveva SQL SECURITY impostato su "INVOKER". Ciò significa che l'utente è stato costretto ad avere l'autorizzazione selezionata sia sulla vista che sulla tabella.

Quando ho modificato SQL SECURITY in "DEFINER", posso concedere all'utente l'autorizzazione di selezione solo sulla vista.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.