Crie um novo usuário no MySQL e dê acesso total a um banco de dados

628

Eu quero criar um novo usuário no MySQL e dar acesso total apenas a um banco de dados, digamos dbTest, que eu criei com um comando como create database dbTest;. Quais seriam os comandos do MySQL para fazer isso?

jimgh
fonte

Respostas:

829

Tente isso para criar o usuário:

CREATE USER 'user'@'hostname';

Tente isto para dar acesso ao banco de dados dbTest:

GRANT ALL PRIVILEGES ON dbTest.* To 'user'@'hostname' IDENTIFIED BY 'password';

Se você estiver executando o código / site acessando o MySQL na mesma máquina, o nome do host seria localhost.

Agora, o colapso.

GRANT - Este é o comando usado para criar usuários e conceder direitos a bancos de dados, tabelas, etc.

ALL PRIVILEGES- Isso indica que o usuário terá todos os privilégios padrão. No entanto, isso não inclui o privilégio de usar o comando GRANT.

dbtest.*- Estas instruções MySQL aplicam esses direitos para uso em todo o banco de dados dbtest. Você pode substituir o * por nomes de tabelas específicos ou rotinas de armazenamento, se desejar.

TO 'user'@'hostname'- 'usuário' é o nome de usuário da conta que você está criando. Nota: Você deve ter aspas simples lá. 'hostname' diz ao MySQL de quais hosts o usuário pode se conectar. Se você quiser apenas da mesma máquina, uselocalhost

IDENTIFIED BY 'password' - Como você deve ter adivinhado, isso define a senha para esse usuário.

Dan McGrath
fonte
82
Se você estiver permitindo acesso à rede e quiser uma conexão de qualquer host, poderá alterar 'hostname' para '%'. Por exemplo, ... TO 'dbuser' @ '%' IDENTIFIED ... '%' é o curinga do host.
Physicsmichael 12/11/2009
17
Não se esqueça de liberar privilégios quando estiver trabalhando em usuários e tabelas! :-)
corsiKa
31
Isso funcionou para mim: CRIAR USUÁRIO 'user1' @ 'localhost' IDENTIFICADO POR 'senha'; CONCEDE TODOS OS PRIVILÉGIOS EM db_database1. * Para 'user1' @ 'localhost' IDENTIFICADO POR 'senha'; PRIVILÉGIOS DE LAVAGEM;
Mohamad Fakih 27/03
4
@DanMcGrath: A cláusula IDENTIFIED BY 'password' é obrigatória, se o usuário já existir e tiver uma senha?
Nanosoft 22/03
8
O uso do GRANT para criar um novo usuário será removido em versões futuras do MySQL (ele está obsoleto no momento em que foi escrito). No futuro, isso terá que ser feito com duas chamadas, CRIAR USUÁRIO e depois CONCEDER.
Darren Felton
325

Sintaxe

Para criar usuário no MySQL / MariaDB 5.7.6 e superior, use a CREATE USERsintaxe :

CREATE USER 'new_user'@'localhost' IDENTIFIED BY 'new_password';

para conceder todo acesso ao banco de dados (por exemplo my_db), use GRANTSintaxe , por exemplo

GRANT ALL ON my_db.* TO 'new_user'@'localhost';

Onde ALL( tipo_priv ) pode ser substituído por privilégio específico, como SELECT, INSERT, UPDATE, ALTER, etc.

Em seguida, para recarregar as permissões recém-atribuídas, execute:

FLUSH PRIVILEGES;

Executando

Para executar os comandos acima, você precisa executar o mysqlcomando e digitá-los no prompt; em seguida, efetue logout pelo quitcomando ou Ctrl- D.

Para executar a partir do shell, use o -eparâmetro (substitua SELECT 1por um dos comandos acima):

$ mysql -e "SELECT 1"

ou imprima a instrução da entrada padrão:

$ echo "FOO STATEMENT" | mysql

Se o acesso foi negado acima, especifique os parâmetros -u(para usuário) e -p(para senha) ou, para acesso a longo prazo, defina suas credenciais ~/.my.cnf, por exemplo

[client]
user=root
password=root

Integração com Shell

Para pessoas que não estão familiarizadas com a sintaxe do MySQL, aqui estão algumas funções úteis do shell, fáceis de lembrar e usar (para usá-las, você precisa carregar as funções do shell incluídas mais adiante).

Aqui está um exemplo:

$ mysql-create-user admin mypass
| CREATE USER 'admin'@'localhost' IDENTIFIED BY 'mypass'

$ mysql-create-db foo
| CREATE DATABASE IF NOT EXISTS foo

$ mysql-grant-db admin foo
| GRANT ALL ON foo.* TO 'admin'@'localhost'
| FLUSH PRIVILEGES

$ mysql-show-grants admin
| SHOW GRANTS FOR 'admin'@'localhost'
| Grants for admin@localhost                                                                                   
| GRANT USAGE ON *.* TO 'admin'@'localhost' IDENTIFIED BY PASSWORD '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4' |
| GRANT ALL PRIVILEGES ON `foo`.* TO 'admin'@'localhost'

$ mysql-drop-user admin
| DROP USER 'admin'@'localhost'

$ mysql-drop-db foo
| DROP DATABASE IF EXISTS foo

Para usar os comandos acima, você precisa copiar e colar as seguintes funções no seu arquivo rc (por exemplo .bash_profile) e recarregar seu shell ou originar o arquivo. Nesse caso, basta digitar source .bash_profile:

# Create user in MySQL/MariaDB.
mysql-create-user() {
  [ -z "$2" ] && { echo "Usage: mysql-create-user (user) (password)"; return; }
  mysql -ve "CREATE USER '$1'@'localhost' IDENTIFIED BY '$2'"
}

# Delete user from MySQL/MariaDB
mysql-drop-user() {
  [ -z "$1" ] && { echo "Usage: mysql-drop-user (user)"; return; }
  mysql -ve "DROP USER '$1'@'localhost';"
}

# Create new database in MySQL/MariaDB.
mysql-create-db() {
  [ -z "$1" ] && { echo "Usage: mysql-create-db (db_name)"; return; }
  mysql -ve "CREATE DATABASE IF NOT EXISTS $1"
}

# Drop database in MySQL/MariaDB.
mysql-drop-db() {
  [ -z "$1" ] && { echo "Usage: mysql-drop-db (db_name)"; return; }
  mysql -ve "DROP DATABASE IF EXISTS $1"
}

# Grant all permissions for user for given database.
mysql-grant-db() {
  [ -z "$2" ] && { echo "Usage: mysql-grand-db (user) (database)"; return; }
  mysql -ve "GRANT ALL ON $2.* TO '$1'@'localhost'"
  mysql -ve "FLUSH PRIVILEGES"
}

# Show current user permissions.
mysql-show-grants() {
  [ -z "$1" ] && { echo "Usage: mysql-show-grants (user)"; return; }
  mysql -ve "SHOW GRANTS FOR '$1'@'localhost'"
}

Nota: Se você preferir não deixar rastreio (como senhas) no seu histórico do Bash, verifique: Como impedir que os comandos apareçam no histórico do bash?

kenorb
fonte
1
Você precisa criar o usuário e conceder privilégios separadamente? Eu descobri que o comando grant parece criar o próprio usuário, pelo menos olhando na tabela mysql.user que parece dessa maneira.
Tim
@CreativityKills Funcionará com a senha se você adicioná-la à sua, ~/.my.cnfconforme sugerido acima.
kenorb
deixando vestígios da senha na história shell não é uma grande idéia
dmirkitanov
@dmirkitanov Você pode impedir isso adicionando um espaço, consulte: Como impedir que os comandos apareçam no histórico do bash?
kenorb
58

Para criar um usuário e conceder todos os privilégios em um banco de dados.

Entre no MySQL:

mysql -u root

Agora crie e conceda

GRANT ALL PRIVILEGES ON dbTest.* To 'user'@'hostname' IDENTIFIED BY 'password';

Usuário anônimo (apenas para teste local)

Como alternativa, se você deseja apenas conceder acesso irrestrito total a um banco de dados (por exemplo, na sua máquina local para uma instância de teste, você pode conceder acesso ao usuário anônimo, da seguinte forma:

GRANT ALL PRIVILEGES ON dbTest.* To ''@'hostname'

Estar ciente

Isso é bom para dados indesejados no desenvolvimento. Não faça isso com qualquer coisa que lhe interessa.

superluminário
fonte
3
Você pode criar um usuário anônimo assim, mas não! Não há um bom motivo para ter um usuário com privilégios totais e sem senha, mas pode arruinar seu dia / ano / empresa / trabalho um dia se alguém obtiver acesso ao servidor que não deveria. Por que tornar mais fácil para eles?
Luke Cousins
2
Se alguém obteve acesso remoto ao meu macbook, tenho mais coisas com que me preocupar do que o conteúdo do meu banco de dados de desenvolvimento. Eu deveria reiterar, isso é apenas para testes locais, não faça isso com dados reais.
superluminary
4
Exatamente, com todas essas outras coisas com que se preocupar, também não se preocupe com o conteúdo do seu banco de dados dev. Seu banco de dados de desenvolvimento (provavelmente) terá trechos de dados do banco de dados ativo (por exemplo, para replicar um bug), que devem ser feitos todos os esforços para manter a segurança. Simplesmente não há necessidade de acessar o banco de dados sem uma senha. Isso nem economiza tempo. Não vale o aborrecimento potencial.
Luke Cousins
1
Possivelmente. No meu caso, são dados indesejados, viverei com o risco.
superluminary
17
$ mysql -u root -p -e "grant all privileges on dbTest.* to
`{user}`@`{host}` identified by '{long-password}'; flush privileges;"

ignore a opção -p , se o usuário do mysql não tiver senha ou apenas pressione o botão "[Enter]" para ignorar. as cordas cercadas por chaves precisam ser substituídas por valores reais.

SK Venkat
fonte
13

Você pode criar novos usuários usando a instrução CREATE USER e conceder direitos a eles usando GRANT .

candiru
fonte
CRIAR USUÁRIO 'jeffrey' @ 'localhost' IDENTIFICADO POR 'mypass';
Cgl
6

Para mim, isso funcionou.

CREATE USER 'spowner'@'localhost' IDENTIFIED BY '1234'; 
GRANT ALL PRIVILEGES ON test.* To 'spowner'@'localhost'; 
FLUSH PRIVILEGES;

Onde

  • spowner: nome de usuário
  • 1234: senha do spowner
  • teste: o 'spowner' do banco de dados tem acesso a
Park JongBum
fonte
2

O comando abaixo funcionará se você desejar criar um novo usuário, dar a ele todo o acesso a um banco de dados específico (nem todos os bancos de dados no seu Mysql) no seu host local.

GRANT ALL PRIVILEGES ON test_database.* TO 'user'@'localhost' IDENTIFIED BY 'password';

Isso concederá todos os privilégios a um banco de dados test_database(no seu caso dbTest) para esse usuário no host local.

Verifique quais permissões o comando acima emitiu para esse usuário executando o comando abaixo.

SHOW GRANTS FOR 'user'@'localhost'

Por precaução, se você deseja limitar o acesso do usuário a apenas uma única tabela

GRANT ALL ON mydb.table_name TO 'someuser'@'host';
Prabhakar Undurthi
fonte
Erro de sintaxe e um erro de digitação em sua primeira linha, o "PRIVILEGES ON 'test_datase'" não deve ter aspas, deve ter o ". *" Depois dele, por exemplo, test_datase. * E é um erro de digitação, deve ser "test_database "
Brettins 19/09/16
0

Caso a hostpeça seja omitida, o padrão é o símbolo curinga %, permitindo todos os hosts.

CREATE USER 'service-api';

GRANT ALL PRIVILEGES ON the_db.* TO 'service-api' IDENTIFIED BY 'the_password'

SELECT * FROM mysql.user;
SHOW GRANTS FOR 'service-api'
dummyDev
fonte