Marchan4
@Marchan4 (Marchan4)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

database.ymlにユーザ名とパスワードを設定致したのに、using password:NOというエラーが出てしまった理由は何なのでしょうか。

rubyのバージョンは3.0.0、 mysqlのバージョンは5.7、 mysql2のバージョンは0.5.3、
bundlerバージョンは2.2.3、 homebrewバージョン3.0.10、
railsのバージョンは5.0.7.2です。

使用機器はmacOS Big Sur バージョン11.2.2です。使用中のテキストエディタはAtomです。

tasklistというアプリを作っておる最中なのですが、

Gemfile

gem 'mysql2', '0.4.10', :source => 'https://rubygems.org'

を削除して、

Gemfileに以下のコードを追加して、$ bundle installを実行致しました。

gem 'mysql2', '~> 0.5.0', '< 0.6.0', :source => 'https://rubygems.org'

database.ymlファイルに以下のコードを入力致しました。(※一部の記述は割愛致しました。)

database.yml
default: &default
  username: <%= ENV['DB_USERNAME'] %>
  password: <%= ENV['DB_USERPASSWORD'] %>

development:
  <<: *default
  database: tasklist_development


test:
  <<: *default
  database: tasklist_test




production:
  <<: *default
  database: tasklist_production
  username: tasklist
  password: <%= ENV['TASKLIST_DATABASE_PASSWORD'] %>

この後にターミナルに

$ vim .bash_profile

と打ち込んで、インサートモードで

export DB_USERNAME='自分のデータベースのユーザ名'
export DB_USERPASSWORD='自分のデータベースのパスワード'

という風にユーザ名とパスワードを入力致しました。その後にターミナルに

$ source ~/.bash_profile

打ち込んで、ターミナルで$ rails sを実行致しました。実行結果が以下の画像の通りになりました。

Action Controller: Exception caught using password:NO (モザイクあり).jpg

database.ymlにユーザ名とパスワードを設定致したのに、

MySql2::Error::ConnecitionError Access denied for user 'root'@'localhost'(using password: NO)

というエラーが出てしまった理由は何なのでしょうか。

0

2Answer

パスワードが正しく設定されていないのだと思います。

  • 環境変数に正しく設定されているか
  • database.ymlに環境変数の値が挿入されているか
  • database.ymlが正しく読み込まれているか

例えばこのような点を確認してみてはいかがでしょうか?

ただ、ユーザ名が正しく設定されているとすると、パスワード自体に問題がありそうな気もしますね。
例えばパスワードに#が含まれていないでしょうか?
YAMLでは#以降はコメント扱いになるので、#から始まるパスワードがコメント扱いでパスワード無しになってしまった、ということはないでしょうか?

0Like

登録しているデーターベースの接続ユーザーは、エラーメッセージに出ている通り root で間違いないですか?
(もし、設定しているユーザーが root でない場合には、環境変数がうまく読み込めていない可能性があります)

MySQL 5.7 のデフォルトではセキュリティのため、 OS 側の管理者でないと MySQL の root ユーザーにログインできないようになっていると思います。
(すでに理解していて変更済であれば、以下は無視してください)

MySQL の root ユーザーはデーターベースの管理者権限を持っているので、一般的に外部からのアクセス用には使用しません。
なぜなら、アクセスするためにはパスワードをどこかに記載しておかなくてはならず、どれだけ努力しても漏洩の可能性が存在するため、また管理者権限では漏洩した場合の影響が大きいためです。
そこで、MySQL はデフォルトでは、MySQL が動いている OS の管理者権限を持っている場合だけ、MySQL の root ユーザーにログイン可能なようにしています(いつも sudo mysql で入っていますよね?)。

対策としては以下の2つが考えられます。

  • 接続用に root 以外のユーザーを作って、それを使う
    • この場合、新しいユーザーに付与する権限は必要最小限にする
    • パスワードを漏洩しても権限は最小限のため、被害は小さくなる
  • root をパスワードでもログイン可能なように設定を変更する
    • root をパスワードでログイン可能にするのは前述のようにセキュリティ的に問題のある行為ですが、例えば閉域のお試し環境などあまりセキュリティを気にしなくてよい場合には、パスワードでログイン可能にしてしまうケースもあると思います。

もしパスワードでログイン可能にしたい場合には、root で MySQL に入って、以下の2つの SQL を順番に実行することでできるようになると思います。
PASSWORD 部分は、実際のパスワードに変えて登録してください(ここで書いたパスワードで上書きしてしまいます。パスワードを変更しない場合には BY 以降は省略可能かもしれません)。
やっていることは、root ユーザーの認証方法を mysql_native_password という方法に切り替えています。

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'PASSWORD';
FLUSH PRIVILEGES;
0Like

Your answer might help someone💌