2012-05-30 21 views
56

Baza danych My MySQL wymaga dwóch użytkowników: appuser i wsparcia.
Jeden z twórców aplikacji twierdzi, że tworzę cztery konta dla tych użytkowników:Używanie% dla hosta podczas tworzenia użytkownika MySQL

[email protected]'%' 
[email protected]'localhost' 
[email protected]'%' 
[email protected]'localhost' 

dla życia mnie nie mogę zrozumieć, dlaczego sądzi, musimy to. Czy nie użyłbyś symbolu wieloznacznego jako hosta do obsługi "hosta lokalnego"?

Wszelkie pomysły?

(MySQL 5.5 tutaj)

Odpowiedz

76

Procent znak oznacza wszystkie adresy IP tak localhost jest zbędny ... Nie ma potrzeby drugiego rekordu z localhost.

EDIT

Właściwie nie jest 'localhost' jest wyjątkowy w mysql, oznacza to połączenie przez gniazda Unix (lub potoków nazwanych na Windows wierzę), w przeciwieństwie do gniazda TCP/IP. użycie%, ponieważ host nie zawiera "localhost"

+0

W jakiej wersji? W MySQL 5.5.35 "%" pasuje również do localhost. – depquid

+0

Nie tylko "localhost" łączy się za pośrednictwem lokalnego gniazda, 127.0.0.1 (które nie używa gniazda) nie dopasuje również%, ale także localhost. Widziałem to już dziś z instalacją haproxy. – Phillipp

26

Jak zaznaczył @nos w komentarzach aktualnie przyjętej odpowiedzi na to pytanie, przyjęta odpowiedź jest niepoprawna.

Tak, istnieje różnica między używaniem % i localhost dla hosta konta użytkownika podczas łączenia przez gniazdo zamiast standardowego połączenia TCP/IP.

Wartość hosta % nie obejmuje localhost dla gniazd i dlatego musi być określona, ​​jeśli chcesz się połączyć przy użyciu tej metody.

4

Podanie nieco odmiennej odpowiedzi niż dostarczone do tej pory.

Jeśli masz wiersz dla anonimowego użytkownika z localhost w tabeli użytkowników ''@'localhost', to będzie to traktowane jako bardziej szczegółowe niż twój użytkownik z hostem wieloznacznym 'user'@'%'. Dlatego konieczne jest również zapewnienie 'user'@'localhost'.

Możesz to wyjaśnić bardziej szczegółowo na dole this page.

3

Symbol procentu oznacza: dowolny host, w tym połączenia zdalne i lokalne.

Host lokalny umożliwia tylko połączenia lokalne.

(tak, aby rozpocząć, jeśli nie trzeba zdalne połączenia z bazą danych, można pozbyć się appuser @ „%” użytkownikowi od razu)

Tak, tak, że nakładają się na siebie, ale ...

... istnieje powód do ustawienia obu rodzajów kont, wyjaśniono to w dokumentach mysql: http://dev.mysql.com/doc/refman/5.7/en/adding-users.html.

Jeśli masz mieć anonimowego użytkownika na localhost, co można dostrzec z:

select Host from mysql.user where User='' and Host='localhost'; 

a jeśli wystarczy utworzyć appuser użytkownika @ „%” (i nie appuser @ 'localhost '), a następnie gdy użytkownik mysql user łączy się z lokalnym hostem, , anonimowe konto użytkownika jest używane (ma pierwszeństwo przed użytkownikiem appuser @'% ').

A poprawką tego jest (jak można się domyślić) utworzenie appuser @ 'localhost (co jest bardziej szczegółowe niż anonimowy użytkownik lokalnego hosta i będzie używane, jeśli twój appuser łączy się z localhostem).

1

Po prostu przetestujmy.

Podłączanie jako administrator, a następnie:

SHOW VARIABLES LIKE "%version%"; 
+-------------------------+------------------------------+ 
| Variable_name           | Value                        | 
+-------------------------+------------------------------+ 
| version                 | 10.0.23-MariaDB-0+deb8u1-log | 

a następnie

USE mysql; 

Utwórz użytkownika foo z hasłem bar do testowania:

CREATE USER [email protected]'%' IDENTIFIED BY 'bar'; FLUSH PRIVILEGES; 

Aby połączyć się z Unix domeny Gniazdo (to jest rura I/O, która jest nazwana przez wpis systemu plików /var/run/mysqld/mysqld.sock czy coś takiego), uruchom to w wierszu poleceń:

mysql -pbar -ufoo 

Aby połączyć się z TCP/IP końcowego 127.0.0.1:3306 zamiast uruchomić to w wierszu poleceń:

mysql -pbar -ufoo -h127.0.0.1 

Aby sprawdź, czy połączenie odbywa się za pośrednictwem gniazda TCP/IP lub gniazda domeny uniksowej, pobierz identyfikator PID procesu klienta mysql, sprawdzając dane wyjściowe ps faux, a następnie uruchom lsof -p$GOTPID. będzie można zobaczyć coś takiego:

mysql [PID] quux 3u IPv4 [code] 0t0 TCP localhost:[port]->localhost:mysql (ESTABLISHED) 

lub

mysql [PID] quux 3u unix [code] 0t0 [code] socket 

sposób:

Case 0: Host = '10 .10.10.10' (null Test)

update user set host='10.10.10.10' where user='foo'; flush privileges; 
  • Podłącz do gniazda: AWARIA
  • Połącz z 127.0.0.1: AWARIA

Przypadek 1: Host = '%'

update user set host='%' where user='foo'; flush privileges; 
  • Podłączyć do gniazda: OK
  • Połącz 127.0.0.1: OK

Przypadek 2: Host = 'localhost'

update user set host='localhost' where user='foo';flush privileges; 
  • Podłączyć do gniazda: OK
  • Połącz z 127.0.0.1: OK

Przypadek 3: Host = '127.0.0.1'

update user set host='127.0.0.1' where user='foo';flush privileges; 
  • Połącz z gniazdem: AWARIA
  • Połącz z 127.0.0.1: OK

Przypadek 4: Host = ''

update user set host='' where user='foo';flush privileges; 
  • Podłączyć do gniazda: OK
  • Połącz do 127.0.0.1: OK

(Według MySQL 5.7: 6.2.4 Access Control, Stage 1: Connection Verification, Pusty ciąg "" oznacza także "dowolny host", ale sortuje po "%".)

Przypadek 5: Host = '192.168.0.1' (dodatkowy test)

('192.168.0.1' jest jednym z adresów IP mojego komputera, należy zmienić odpowiednio w Twoim przypadku)

update user set host='192.168.0.1' where user='foo';flush privileges; 
  • Połącz z gniazdem: AWARIA
  • Połącz z 127.0.0.1: AWARIA

ale

  • Połącz na 192.168.0.1 z użyciem mysql -pbar -ufoo -h192.168.0.1: OK

krawędzi Przypadek A: Host = '0.0.0.0'

update user set host='0.0.0.0' where user='foo';flush privileges; 
  • Połącz z Socket: niewydolność
  • Połącz z 127.0.0.1: AWARIA

Krawędź Przypadek B: Host = '255.255.255.255'

update user set host='255.255.255.255' where user='foo';flush privileges; 
  • Podłączyć do gniazda: AWARIA
  • Połącz z 127.0.0.1: AWARIA

Cleanup

delete from user where user='foo';flush privileges; 

Uzupełnienie

Aby zobaczyć, co jest w rzeczywistości w tabeli mysql.user, który jest jednym ze stołów zezwolenia, zastosowanie:

SELECT SUBSTR(password,1,6) as password, user, host, 
Super_priv AS su, 
Grant_priv as gr, 
CONCAT(Select_priv, Lock_tables_priv) AS selock, 
CONCAT(Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv) AS modif, 
CONCAT(References_priv, Index_priv, Alter_priv) AS ria, 
CONCAT(Create_tmp_table_priv, Create_view_priv, Show_view_priv) AS views, 
CONCAT(Create_routine_priv, Alter_routine_priv, Execute_priv, Event_priv, Trigger_priv) AS funcs, 
CONCAT(Repl_slave_priv, Repl_client_priv) AS replic, 
CONCAT(Shutdown_priv, Process_priv, File_priv, Show_db_priv, Reload_priv, Create_user_priv) AS admin 
FROM user ORDER BY user, host; 

to daje:

+----------+----------+-----------+----+----+--------+-------+-----+-------+-------+--------+--------+ 
    | password | user  | host  | su | gr | selock | modif | ria | views | funcs | replic | admin | 
    +----------+----------+-----------+----+----+--------+-------+-----+-------+-------+--------+--------+ 
    | *E8D46 | foo  |   | N | N | NN  | NNNNN | NNN | NNN | NNNNN | NN  | NNNNNN | 

Podobnie na stole mysql.db:

SELECT host,db,user, 
     Grant_priv as gr, 
     CONCAT(Select_priv, Lock_tables_priv) AS selock, 
     CONCAT(Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv) AS modif, 
     CONCAT(References_priv, Index_priv, Alter_priv) AS ria, 
     CONCAT(Create_tmp_table_priv, Create_view_priv, Show_view_priv) AS views, 
     CONCAT(Create_routine_priv, Alter_routine_priv, Execute_priv) AS funcs 
     FROM db ORDER BY user, db, host; 
Powiązane problemy