質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Q&A

解決済

1回答

6264閲覧

MongoError: command insert requires authentication でmongodbに権限をどうやって与えるのか?

hokosugi

総合スコア63

MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

0グッド

1クリップ

投稿2021/02/08 08:31

node.js,ExpressでmodelをmongoDB.db(test)にinsertしたいが
MongoError: command insert requires authenticationのエラーです。
insertの権限を要求しているのは分かるのですが、User設定はデータベースadmin
に以下のように書き込んでいるので、他の理由があると推測していますが、よく分かっていません。

色々試してみた結果、ターミナルにmongoコマンドで起動した場合、コマンドを打ち込むと(例)db.getUsers()

uncaught exception: Error: command usersInfo requires authentication :

と上記のエラーと同じような要求をされます。

ちなみにmongo -u rootと打ち込むと見ることが出来ます(下記参考)。
mongoは設定が未完了でExpressのcontroller側(【参考】)がコチラ側を指定しているのではないかと推測します。
ただ、どうやって上記エラーを解消出来るのか分からないので、お聞きします。

宜しくおねがいします。

> use admin > db.getUsers() [ { "_id" : "admin.root", "userId" : UUID("85e20fda-493c-4eaf-999e-f4dc9515e25d"), "user" : "root", "db" : "admin", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" }, { "role" : "readWriteAnyDatabase", "db" : "admin" } ], "mechanisms" : [ "SCRAM-SHA-1", "SCRAM-SHA-256" ] } ]

【参考】 Express controller.js

const express = require('express'); const router = express.Router; const mongoose = require('mongoose'); //mongDB起動 mongoose.Promise = global.Promise; mongoose.connect('mongodb://127.0.0.1:27017/admin', { useNewUrlParser: true, useUnifiedTopology: true }, ); mongoose.connection.on('error', function(err) { console.error('MongoDB connection error: ' + err); }); const schema = require('../models/model'); const Model = mongoose.model('Model', schema); exports.login = function(req, res){ res.render('login', {title: 'Laravel'}); }; exports.loginPost = function(req, res){ const model = new Model(); console.log(model); //req.bodyの中にlogin.ejsのフォーム・インプットのデータが入っていることが前提 model.name = req.body.name; model.password= req.body.password; model.passwordComfirm = req.body.passwordComfirm; console.log(model.password + ':' + model.passwordComfirm); console.log(model.name); if (model.password === model.passwordComfirm && model.password.length >= 7) { model.save(function(err){ if (err) { res.send('error:::'+err);//ここで"command insert requires authentication" } else { //パスワード認証作業をここでする res.render('home', {title: 'Laravel'}); } }); } else { res.send('パスワードが違うか文字数が7以下です'); } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんばんは。もし解決されていなかったら、ご確認ください。

1. 接続できるか確認する

ターミナルからの接続ではデフォルトではパスワード認証なしで接続できるかと思います。
上記の db.getUsers() の結果、管理者相当のユーザが作成されていますが、この作成時のパスワードはお分かりですか?

まずは、いったん以下のように修正してみてはどうでしょう。

JavaScript

1 2// こちらはパスワードがないのでコメントアウト 3// mongoose.connect('mongodb://127.0.0.1:27017/admin', { useNewUrlParser: true, useUnifiedTopology: true }, ); 4 5// connectで指定するURLにアカウント:パスワードの組み合わせを記載 6mongoose.connect('mongodb://root:ルートユーザのパスワード@127.0.0.1:27017/admin', { useNewUrlParser: true, useUnifiedTopology: true }, ); 7

参考: https://mongoosejs.com/docs/4.x/docs/connections.html (Mongoose / Connections)

2. アカウントやデータベースを調整する

もし上記でうまく行った場合。
ユーザの設定を見ると、権限的にも「管理者」としてのユーザになります。
また、アクセスしている ''admin'' というデータベースは、MongoDBの管理用(ユーザ情報や認証情報も含むもの)につかうものなので、通常はアプリケーション用のデータベースを作成してそちらを利用します。

  • アプリケーション用のデータベースを作成する
  • 作成したデータベースにアクセス可能なアプリケーション専用のユーザを作成する
  • Node.jsの mongoose.connect(... の部分もアプリケーション用のユーザとパスワードに書き換える

のが良いです。

参考: https://docs.mongodb.com/manual/reference/method/db.createUser/

また、ユーザはともかくパスワードは、できればソースコードにはハードコードせず、環境変数から取得するといった方法をとってみてください。

JavaScript

1 2# ターミナルから mongo コマンドでMongoDBにアクセスしてから。 3 4# 特定のデータベースのみ管理者権限をもつユーザの作成する例 5# 例:データベース名を myAppDb とする 6 7# まだデータベースが存在しなくても、 use データベース名 とするとコンテキストが変わります 8# 以降の db.createUser は myAppDbデータベースに対する処理になります 9use myAppDb 10db.createUser( 11 { 12 user: "ユーザ名", 13 pwd: "パスワード", 14 roles: 15 [ 16 { 17 role: "userAdmin", 18 db: "myAppDb" 19 } 20 ] 21 } 22)

上記を設定したら、ソースコード側も以下のようにすれば接続できると思います。

JavaScript

1 2mongoose.connect('mongodb://ユーザ名:パスワード@127.0.0.1:27017/myAppDb', { useNewUrlParser: true, useUnifiedTopology: true }, );

投稿2021/02/09 14:47

suama

総合スコア1997

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hokosugi

2021/02/09 20:26

ご回答、ありがとうございます。userとpasswordをconnectに書き込んだら繋がりました。adminではなく新規のdbにユーザー設定も出来て前に進めます。ありがとうございました。
suama

2021/02/09 22:57

よかったです!
hokosugi

2021/02/10 09:58

ご丁寧に、こちらこそありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問