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.