Is my permission wrong?
Sim, você está concedendo a conta mais do que precisa para que sua declaração GRANT esteja errada.
How to forbid non-admin user to modify mysql.* tables?
Quando você concede GRANT permissões à conta SQL local que você cria, apenas conceda-o permissões que ele precisa para acessar os registros de banco de dados ou objetos de banco de dados que ele precisa acessar e nada mais.
O método mais seguro seria conceder apenas as permissões explícitas necessárias aos objetos explícitos do banco de dados, como SELECT , para uma tabela específica, ou EXECUTE , a um procedimento armazenado específico, por exemplo.
Veja os Privilégios Fornecidos pelo MySQL para entender melhor o que cada privilégio permite que uma conta acesse.
Depois de entender como cada privilégio funciona de acordo com os objetos do banco de dados, etc., você pode definir a segurança da conta SQL que você criará.
Quando você diz que não quer permitir a modificação de tabelas mysql, lembre-se que você pode modificar dados dentro de uma tabela onde DELETE e UPDATE permitiriam isso. Por outro lado, a permissão DROP permitiria a exclusão de uma tabela inteira ou a permissão ALTER permitiria a modificação do esquema da tabela, das definições da coluna ou de outros objetos existentes em uma tabela.
Exemplo
Você pode usar o seguinte para conceder uma conta SELECT de acesso a todas as tabelas e EXECUTE de acesso a todos os Procedimentos armazenados em um banco de dados específico:
GRANT CREATE, SELECT, EXECUTE ON 'DatabaseName'
TO 'user'@'localhost'
Every student can create their own database. So, theoretically, deny privileges to mysql database is the only way, right? How can I do
that?
Não, eu testei e confirmei que a solução abaixo funciona. Você basicamente permite que as contas student MYSQL GRANT ALL PRIVILEGES , mas apenas para bancos de dados que correspondam a um padrão de nomenclatura específico.
Isso significa que quando você faz os alunos concluírem os exercícios, você precisa garantir que instrua os DBs que eles criaram a ter um nome que corresponda a esse padrão. Isso também significa que o padrão de convenção de nomenclatura escolhido NÃO deve corresponder a um padrão como outros bancos de dados que você não deseja que eles acessem.
Mais uma vez, testei e confirmei que esta solução funciona e é uma solução bastante simples do que ficar explícita com DENY permissões, o que pode ser perigoso, pois você pode facilmente ignorar ou não testar todos os cenários possíveis e essa é a razão pela qual vocêDENY all e only GRANT o que você deseja permitir em termos de segurança.
Exemplo
GRANT ALL PRIVILEGES ON 'student\_%' . * TO 'student'@'%';
Fonte de crédito
Agora, um usuário chamado student pode criar qualquer banco de dados na instância do MYSQL, desde que o nome seja ou comece com student_ . A barra invertida é o caractere de escape para o caractere underbar.