MySQL DB에서 와일드 카드 (%) 액세스를 허용하고 " '<user>'@ 'localhost'에 대한 액세스가 거부되었습니다."오류가 발생 함


16

데이터베이스와 사용자를 만들었으며 다음을 통해 액세스를 허용했습니다.

create user 'someuser'@'%' identified by 'password';
grant all privileges on somedb.* to 'someuser' with grant option;

그러나 MySQL에 연결하려고하면 다음 오류가 발생합니다.

$ mysql -u someuser -p
> Enter Password:
> ERROR 1045 (28000): Access denied for user 'someuser'@'localhost' (using password: YES)

"%"가 와일드 카드 인 경우 localhost도 활성화하지 않습니까? 그러나 암호를 사용하도록 지정하지 않으면 데이터베이스에 잘 연결할 수 있습니다. 사용자를 만들 때 암호를 지정하기 때문에 의미가 없습니다.

답변:


16

로 연결해보십시오 mysql -u someuser -p -h 127.0.0.1.

비밀번호없이 연결할 수있는 경우, .my.cnf에 신임 정보를 저장했거나 비밀번호없이 액세스 할 수있는 계정을 작성했습니다.


mysql 문서의이 의견도 관련이있을 수 있습니다.

http://dev.mysql.com/doc/refman/5.1/en/access-denied.html

액세스 거부 이유를 알 수없는 경우 와일드 카드 ( '%'또는 '_'문자를 포함하는 항목)를 포함하는 호스트 값이있는 모든 항목을 사용자 테이블에서 제거하십시오. 매우 일반적인 오류는 Host = '%'및 User = 'some_user'를 사용하여 새 항목을 삽입하는 것입니다. 이렇게하면 동일한 시스템에서 연결할 로컬 호스트를 지정할 수 있습니다. 이것이 작동하지 않는 이유는 기본 권한에 Host = 'localhost'및 User = ''항목이 포함되어 있기 때문입니다. 해당 항목은 '%'보다 더 구체적인 'localhost'호스트 값을 가지므로 localhost에서 연결할 때 새 항목보다 우선적으로 사용됩니다! 올바른 절차는 Host = 'localhost'및 User = 'some_user'로 두 번째 항목을 삽입하는 것입니다.


호스트 정의 및 ~ / .my.cnf 참조를 포함한 +1
Andy

7

다음이 필요하다고 확신합니다.

grant 옵션을 사용하여 somedb. *에 대한 모든 권한을 'someuser'@ '%'에 부여하십시오.

GRANT 문에 호스트 이름 선언이 없습니다.


위치를 지정해야합니다.GRANT ALL ON somedb.* TO 'someuser'@'10.1.10.1';
tacotuesday

6

someuser @ '%'를 사용하여 mysql에 연결할 수없는 경우, 여기서 '%'는 호스트 이름의 와일드 카드입니다. 사용자 테이블에 ''@localhost 항목이 없는지 확인하십시오. 다음 SQL 문을 사용하여 확인하십시오.

    mysql> SELECT * FROM user WHERE user='' AND host='localhost';

''@localhost가 있으면 다음 SQL 문을 실행하여 제거하십시오.

    mysql> DELETE FROM user WHERE user='' AND host='localhost';

마지막으로

    FLUSH PRIVILEGES;

이제 someuser @ '%'가 데이터베이스에 연결됩니다.


'username'@ 'localhost'권한을 부여해도 다른 위치의 동일한 사용자에게 권한이 부여되지 않습니다.
tacotuesday

이것은 어떻게 관련이 있습니까? 'localhost'의 ''사용자는 무엇을 유발합니까?
Steve Buzonas

1
@SteveBuzonas 이것은 절대적으로 관련이 있습니다. Zoredache가 게시 한 답변에 대한 코드 예제를 제공합니다. 로컬 호스트는 '%'보다 더 구체적이므로 '%'에 액세스 권한이있는 사용자와 로컬 호스트를 통해 연결을 시도하면 로컬 호스트 항목이 더 구체적이므로 mysql은 localhost에서 로그인을 시도하지만 빈 사용자 이름과 빈 비밀번호. 제공된 자격 증명이 아니므로 액세스 거부 오류가 발생합니다. 이러한 항목을 제거하면 '%'의 사용자가 액세스 할 수 있습니다.
bstakes

@bstakes mysql 클라이언트의 기본 동작은 사용자 이름을 지정하지 않으면 쉘 사용자 이름을 사용하는 것입니다. 질문에는 예제와 오류 메시지에 사용자가 있습니다. ''사용자가 명명 된 사용자와 어떻게 충돌하는지 궁금했습니다. ''와일드 카드입니까?
Steve Buzonas

@SteveBuzonas ''는 localhost와 관련하여 와일드 카드처럼 작동합니다. MySQL Docs에서 위에서 언급 한 기본값을 참조하는 위의 답변에 표시된대로 : "항목에 '%'보다 더 구체적인 Host 값 'localhost'가 있으므로 localhost에서 연결할 때 새 항목에 우선하여 사용됩니다. 올바른 절차는 Host = 'localhost'및 User = 'some_user'로 두 번째 항목을 삽입하거나 Host = 'localhost'및 User = ''로 항목을 삭제하는 것입니다. "
bstakes

4

내 이해 와이 문제를 해결할 준비가되어 있습니다 .MySQL은 localhost를 %로 별도로 처리한다는 것입니다. 즉, localhost는 와일드 카드에 포함되지 않습니다.


dev.mysql.com/doc/refman/5.1/en/connection-access.html에 제공된 예제 는 이것이 정확하지 않을 수 있다고 생각합니다. 그렇지 않으면 참조가 있습니까?
Warner

이 문제에 대한 본인의 이해는 인쇄물과 구두로 동일한 문제를보고하고 "%"와 "localhost"를 사용하여 2 명의 사용자를 작성하여 해결하는 다른 사람들을 기반으로합니다. 공식적으로 문서화 된 것을 실제로 본 적이 없습니다.
John Gardeniers

1
이것은 우분투 12.04 LTS에서 적어도 올바른 것 같습니다
Dex

나에게 일어난 일은 내가 가지고 있었고 user@%포함하기 전까지는 작동하지 않았다는 것 user@localhost입니다. 그런 다음 대답 stackoverflow.com/a/29421084/4850646을 보고 호스트가있는 익명 사용자가 있음을 깨달았습니다 localhost. 나는 모든 익명 사용자 를 제거 하고 제거 한 후에도localhost 해당 사용자 에 액세스 할 수있었습니다 (만 허용 ). 보다 구체적 이기 때문에 익명 사용자 인 경우에도 먼저 사용자를 시도합니다 . user@localhostuser@%localhost%localhost
Lucas Basquerotto

0

flush privileges;사용자를 만든 후 실행 했습니까 ? 그렇지 않으면 서버를 다시 시작할 때까지 사용자 / 권한을 변경하지 않아도됩니다.

그런 다음 '%'@ 'localhost'항목이 없는지 확인하십시오.


4
'사용자 만들기'및 'grant'를 사용하면 자동으로 권한이 플러시됩니다. mysql 데이터베이스를 직접 조작하는 경우에만 권한을 플러시해야합니다.
Zoredache
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.