Tenho um usuário que pode ser acessado de qualquer host (estamos atualmente em desenvolvimento). Mas quero limitar a execução de procedimentos armazenados apenas para localhost. O problema é que o localhost
usuário não é reconhecido.
DROP USER IF EXISTS 'admin'@'%';
CREATE USER IF NOT EXISTS 'admin'@'%' IDENTIFIED WITH 'caching_sha2_password' BY 'my_password';
###########################
### STORED PROCEDURES ###
###########################
GRANT EXECUTE ON MY_DATABASE.* TO 'admin'@'127.0.0.1';
###########################
### SELECT ###
###########################
GRANT SELECT ON MY_DATABASE.MY_TABLE TO 'admin'@'%' WITH GRANT OPTION;
GRANT SELECT ON MY_DATABASE.MY_TABLE2 TO 'admin'@'%' WITH GRANT OPTION;
.
.
.
Executar esse código me gera o próximo erro.
[2024-11-23 20:59:09] [42000][1410] You are not allowed to create a user with GRANT
Alterar o host "resolve" o erro, mas quero limitar a execução ao localhost. Não sei se preciso apenas adicionar um novo usuário assim.
CREATE USER IF NOT EXISTS 'admin'@'127.0.0.1' IDENTIFIED WITH 'caching_sha2_password' BY 'my_password';
###########################
### STORED PROCEDURES ###
###########################
GRANT EXECUTE ON MY_DATABASE.* TO 'admin'@'127.0.0.1';
###########################
### SELECT ###
###########################
GRANT SELECT ON MY_DATABASE.MY_TABLE1 TO 'admin'@'127.0.0.1' WITH GRANT OPTION;
GRANT SELECT ON MY_DATABASE.MY_TABLE2 TO 'admin'@'127.0.0.1' WITH GRANT OPTION;
.
.
.
Ou se houver outra maneira sem repetir a definição do usuário
Um usuário para MySQL é a combinação de um nome de usuário e uma string fixa que é o nome do host. A string do nome do host pode conter curingas
%
ou_
, mas ainda é uma string fixa.Se você consultar,
select user, host from mysql.user
verá aquela string fixa. Essa é a entrada do usuário.Você pode CONCEDER privilégios ao usuário somente pelo nome que ele está definido. Se você definiu somente um usuário chamado
admin@%
, então esse é o único usuário que existe. Você não pode conceder um privilégio a[email protected]
porque esse usuário não existe.Você pode definir dois usuários, um nomeado
admin@%
e um nomeado[email protected]
. Esses são dois usuários separados e podem receber privilégios diferentes.Quando um cliente se conecta por TCP, ele se autentica contra o usuário cuja porção do host corresponde mais especificamente ao endereço IP do cliente. Nesse caso, se você se conectar de 127.0.0.1 (localhost via TCP), ele preferirá se autenticar contra
[email protected]
e, uma vez autenticada, a sessão terá os privilégios que você concedeu a esse usuário.