Conceder permissões nas visualizações, negar seleção nas tabelas

9

Eu tenho um usuário MySQL e quero que ele visualize APENAS as visualizações que eu quero e não qualquer outra tabela no banco de dados. Eu concedi a este usuário permissões apenas em determinadas visualizações, como a seguir:

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

Se eu fizer uma show grants;declaração, só posso ver essas permissões conforme o esperado. No entanto, eu gostaria que esse usuário consultasse APENAS as exibições e não as tabelas relacionadas a essas exibições, mas não consigo encontrar uma maneira de fazer isso. Parece que se eu quiser que o usuário faça uma seleção na exibição, a seleção também deve ser concedida para a tabela, ou estou errado?

Se eu negar a selectinstrução no restante das tabelas e na linha de comando, tentar fazer uma seleção, obtive o seguinte:

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

É isso que eu realmente quero, mas também sou negado se selecionar os dados da visualização.

Existe uma maneira de disponibilizar ao usuário apenas as visualizações e não as tabelas?

Metafaniel
fonte

Respostas:

6

Você terá que tratar a vista como uma tabela. O information_schema já faz

Se você correr

SELECT table_name FROM information_schema.tables
WHERE engine IS NULL;

você obtém todas as visualizações.

Basta conceder SELECT na visualização ao usuário da seguinte maneira

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

Depois de fazer isso, você deverá ter acesso SELECT à tabela.

Para ter certeza, execute SHOW GRANTS FOR 'thisUser'@'localhost';

Você também deve poder ver a que acesso em nível de tabela é concedido 'thisUser'@'localhost'

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

Você também pode ver a que usuário tem acesso no nível da tabela myDatabase.fordibenForYouTable

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

DE UMA CHANCE !!!

RolandoMySQLDBA
fonte
Ei, você conseguiu! Obrigado! Não consegui encontrar a solução para mim! Muito obrigado!
Metafaniel
5

Eu sei que isso é velho agora, mas aqui está o que resolveu esse problema para mim ...

A resposta foi com a sintaxe "SQL SECURITY".

minha definição de exibição original tinha o SQL SECURITY definido como "INVOKER". Isso significava que o usuário era forçado a ter permissão de seleção na exibição e na tabela.

Quando alterei o SQL SECURITY para "DEFINER", posso conceder ao usuário permissão de seleção apenas na exibição.

John
fonte