Utwórz nowego użytkownika w MySQL i zapewnij mu pełny dostęp do jednej bazy danych

628

Chcę utworzyć nowego użytkownika w MySQL i dać mu pełny dostęp tylko do jednej bazy danych, powiedzmy dbTest, którą tworzę za pomocą polecenia podobnego create database dbTest;. Jakie byłyby do tego celu polecenia MySQL?

jimgh
źródło

Odpowiedzi:

829

Spróbuj utworzyć użytkownika:

CREATE USER 'user'@'hostname';

Spróbuj, aby dać mu dostęp do bazy danych dbTest:

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

Jeśli uruchamiasz kod / witrynę uzyskującą dostęp do MySQL na tym samym komputerze, nazwą hosta będzie localhost.

Teraz załamanie.

GRANT - To polecenie służy do tworzenia użytkowników i przyznawania uprawnień do baz danych, tabel itp.

ALL PRIVILEGES- Oznacza to, że użytkownik będzie miał wszystkie standardowe uprawnienia. Nie obejmuje to jednak uprawnienia do korzystania z polecenia GRANT.

dbtest.*- Niniejsza instrukcja MySQL do zastosowania tych praw do użytku w całej bazie danych dbtest. Jeśli chcesz, możesz zastąpić * konkretnymi nazwami tabel lub procedurami przechowywania.

TO 'user'@'hostname'- „użytkownik” to nazwa użytkownika konta użytkownika, które tworzysz. Uwaga: Musisz tam mieć pojedyncze cytaty. „nazwa hosta” informuje MySQL, z których hostów użytkownik może się połączyć. Jeśli chcesz go tylko z tego samego komputera, użyjlocalhost

IDENTIFIED BY 'password' - Jak można się domyślić, ustawia to hasło dla tego użytkownika.

Dan McGrath
źródło
82
Jeśli zezwalasz na dostęp do sieci i chcesz mieć połączenie z dowolnego hosta, możesz zmienić „hostname” na „%”. Na przykład ... DO „dbuser” @ '%' IDENTYFIKOWANY ... '%' jest symbolem zastępczym hosta.
physicsmichael
17
Nie zapomnij opróżnić uprawnień, gdy pracujesz nad użytkownikami i tabelami! :-)
corsiKa
31
To zadziałało dla mnie: UTWÓRZ UŻYTKOWNIKA „użytkownik1” @ „localhost” IDENTYFIKOWANY PRZEZ „hasło”; UDZIEL WSZYSTKICH UPRAWNIEŃ NA db_database1. * Do „user1” @ „localhost” IDENTYFIKOWANY PRZEZ „hasło”; PRZYWILEJE PŁUCZĄCE;
Mohamad Fakih
4
@DanMcGrath: Czy klauzula IDENTYFIKOWANA PRZEZ hasło jest obowiązkowa, jeśli użytkownik już istnieje i ma hasło?
nanosoft
8
Użycie GRANT do utworzenia nowego użytkownika zostanie usunięte w przyszłych wersjach MySQL (jest przestarzałe w momencie pisania tego). W przyszłości będzie to wymagało dwóch połączeń: UTWÓRZ UŻYTKOWNIKA, a następnie GRANT.
Darren Felton
325

Składnia

Aby utworzyć użytkownika w MySQL / MariaDB 5.7.6 i nowszych, użyj CREATE USERskładni :

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

następnie, aby udzielić całego dostępu do bazy danych (np. my_db), użyj GRANTSkładni , np

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

Gdzie ALL( typ_uprawnien ) można zastąpić konkretnego przywilejów, takich jak SELECT, INSERT, UPDATE, ALTER, etc.

Następnie, aby ponownie załadować nowo przypisane uprawnienia, uruchom:

FLUSH PRIVILEGES;

Wykonywanie

Aby uruchomić powyższe polecenia, musisz uruchomić mysqlpolecenie i wpisać je w wierszu polecenia, a następnie wylogować się za pomocą quitpolecenia lub Ctrl- D.

Aby uruchomić z powłoki, użyj -eparametru (zamień na SELECT 1jedno z powyższych poleceń):

$ mysql -e "SELECT 1"

lub wydrukuj wyciąg ze standardowego wejścia:

$ echo "FOO STATEMENT" | mysql

Jeśli masz powyżej odmowę dostępu , określ parametry -u(dla użytkownika) i -p(dla hasła) lub dla dostępu długoterminowego ustaw swoje poświadczenia ~/.my.cnf, np.

[client]
user=root
password=root

Integracja z powłoką

Dla osób, które nie znają składni MySQL, oto przydatne funkcje powłoki, które są łatwe do zapamiętania i użycia (aby z nich skorzystać, należy załadować zawarte w nich funkcje powłoki).

Oto przykład:

$ 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

Aby użyć powyższych poleceń, musisz skopiować i wkleić następujące funkcje do pliku rc (np. .bash_profile) I ponownie załadować powłokę lub plik źródłowy. W takim przypadku po prostu wpisz 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'"
}

Uwaga: Jeśli wolisz nie zostawiać śladu (np. Haseł) w historii Bash, sprawdź: Jak zapobiec wyświetlaniu się poleceń w historii Bash ?

kenorb
źródło
1
Czy musisz utworzyć użytkownika i osobno nadać uprawnienia? Odkryłem, że polecenie grant wydaje się tworzyć samego użytkownika, przynajmniej tak wygląda tabela mysql.user.
Tim
@CreativityKills będzie działać z hasłem, jeśli dodasz je do swojego, ~/.my.cnfjak sugerowano powyżej.
kenorb
pozostawienie śladów hasła w historii powłoki nie jest świetnym pomysłem
dmirkitanov
@dmirkitanov Można temu zapobiec, dodając spację, patrz: Jak zapobiec wyświetlaniu się poleceń w historii bash?
kenorb
58

Aby utworzyć użytkownika i nadać wszystkie uprawnienia do bazy danych.

Zaloguj się do MySQL:

mysql -u root

Teraz utwórz i udziel

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

Anonimowy użytkownik (tylko do testów lokalnych)

Alternatywnie, jeśli chcesz po prostu przyznać pełny nieograniczony dostęp do bazy danych (np. Na komputerze lokalnym dla instancji testowej, możesz przyznać dostęp anonimowemu użytkownikowi, np .:

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

Być świadomym

To jest dobre dla niepotrzebnych danych w fazie rozwoju. Nie rób tego z czymś, na czym ci zależy.

superluminarny
źródło
3
Możesz utworzyć takiego anonimowego użytkownika, ale nie rób tego! Nie ma dobrego powodu, aby mieć użytkownika z pełnymi uprawnieniami i bez hasła, ale może zrujnować cię dzień / rok / biznes / pracę jednego dnia, jeśli ktoś uzyska dostęp do twojego serwera, który nie powinien. Po co ułatwiać im coś jeszcze?
Luke Cousins,
2
Jeśli ktoś uzyskał zdalny dostęp do mojego MacBooka, mam więcej powodów do zmartwień niż zawartość mojej programistycznej bazy danych. Powinienem powtórzyć, to jest tylko do testów lokalnych, nie rób tego z prawdziwymi danymi.
superluminarny
4
Dokładnie, biorąc pod uwagę wszystkie inne rzeczy, o które należy się martwić, nie przejmuj się również zawartością bazy danych deweloperów. Twoja baza danych deweloperów może (prawdopodobnie będzie) zawierać fragmenty żywych danych bazy danych (np. Do replikacji błędu), które należy dołożyć wszelkich starań, aby zachować bezpieczeństwo. Po prostu nie ma potrzeby dostępu do bazy danych bez hasła. To nawet nie oszczędza czasu. Nie warte potencjalnego problemu.
Luke Cousins,
1
Być może. W moim przypadku są to niepotrzebne dane, zaryzykuję.
superluminarny
17
$ mysql -u root -p -e "grant all privileges on dbTest.* to
`{user}`@`{host}` identified by '{long-password}'; flush privileges;"

zignoruj opcję -p , jeśli użytkownik mysql nie ma hasła lub po prostu naciśnij przycisk „[Enter]”, aby ominąć. ciągi otoczone nawiasami klamrowymi należy zastąpić rzeczywistymi wartościami.

SK Venkat
źródło
13

Możesz tworzyć nowych użytkowników za pomocą instrukcji CREATE USER i nadawać im uprawnienia za pomocą GRANT .

Candiru
źródło
UTWÓRZ UŻYTKOWNIKA „jeffrey” @ „localhost” IDENTYFIKOWANY PRZEZ „mypass”;
cgl
6

Dla mnie to zadziałało.

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

gdzie

  • spowner: nazwa użytkownika
  • 1234: hasło spownera
  • test: „spowner” bazy danych ma prawo dostępu do
Park JongBum
źródło
2

Poniższe polecenie będzie działać, jeśli chcesz utworzyć nowego użytkownika, dać mu pełny dostęp do określonej bazy danych (nie wszystkich baz danych w Mysql) na komputerze lokalnym.

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

To da wszystkie uprawnienia jednej bazie danych test_database(w twoim przypadku dbTest) temu użytkownikowi na localhost.

Sprawdź, jakie uprawnienia, które powyższe polecenie wydało temu użytkownikowi, uruchamiając poniższe polecenie.

SHOW GRANTS FOR 'user'@'localhost'

Na wszelki wypadek, jeśli chcesz ograniczyć dostęp użytkownika do tylko jednego stołu

GRANT ALL ON mydb.table_name TO 'someuser'@'host';
Prabhakar Undurthi
źródło
Błąd składni i literówka w pierwszym wierszu „PRIVILEGES ON 'test_datase'” nie powinien zawierać cudzysłowów, powinien mieć po nim znak „. *”, Np. Test_datase. *, I jest literówką, powinien być „test_database „.
Brettins,
0

W przypadku hostpominięcia tej części domyślnie jest wyświetlany symbol wieloznaczny %, umożliwiający wszystkim hostom.

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
źródło