OpenShift クラウドで StrongLoop および MongoDB カートリッジを使用していますが、Explorer インターフェースを使用してコレクション内のリソースをクエリおよび操作できません。
簡単なモデル定義を作成し、すべてを OpenShift にデプロイしました。MongoDB のバージョンは 2.4.9 です。MongoDB はコマンド ラインで起動します。
mongod --auth -f /var/lib/openshift/<openshift-account>/mongodb//conf/mongodb.conf run
上記の .conf ファイルは次のとおりです。
# mongodb.conf
bind_ip = <redacted>
#port = 27017
dbpath=/var/lib/openshift/<redacted>/mongodb/data/
pidfilepath=/var/lib/openshift/<redacted>/mongodb/pid/mongodb.pid
# Enables periodic logging of CPU utilization and I/O wait
#cpu = false
# Turn on/off security. Off is currently the default
#noauth = true
# Verbose logging output.
#verbose = true
# Inspect all client data for validity on receipt (useful for
# developing drivers)
#objcheck = true
# Enable db quota management
#quota = true
# Set oplogging level where n is
# 0=off (default)
# 1=W
# 2=R
# 3=both
# 7=W+some reads
#oplog = 0
# Diagnostic/debugging option
#nocursors = true
# Ignore query hints
#nohints = true
# Disable the HTTP interface (Defaults to localhost:27018).
nohttpinterface = true
# Turns off server-side scripting. This will result in greatly limited
# functionality
#noscripting = true
# Turns off table scans. Any query that would do a table scan fails.
#notablescan = true
# Disable data file preallocation.
noprealloc = true
# Specify .ns file size for new databases.
# nssize = <size>
# Accout token for Mongo monitoring server.
#mms-token = <token>
# Server name for Mongo monitoring server.
#mms-name = <server-name>
# Ping interval for Mongo monitoring server.
#mms-interval = <seconds>
# Replication Options
# in replicated mongo databases, specify here whether this is a slave or master
#slave = true
#source = master.example.com
# Slave only: specify a single database to replicate
#only = master.example.com
# or
#master = true
#source = slave.example.com
# Address of a server to pair with.
#pairwith = <server:port>
# Address of arbiter server.
#arbiter = <server:port>
# Automatically resync if slave data is stale
#autoresync
# Custom size for replication operation log.
#oplogSize = 10
# Size limit for in-memory storage of op ids.
#opIdMem = <bytes>
# Specific configuration for openshift cartridge
smallfiles = true
quiet = true
Explore UI を使用して、すべてのオブジェクトの GET を試みています。空の結果を受け取ると思っていましたが、アクセス制御エラーが発生しました。
{
"error": {
"name": "MongoError",
"status": 500,
"message": "not authorized for query on admin.ACL",
"stack": "MongoError: not authorized for query on admin.ACL\n at Object.toError (/var/lib/openshift/544ecf5f4382ec1dcc0002ec/app-root/runtime/repo/node_modules/loopback-connector-mongodb/node_modules/mongodb/lib/mongodb/utils.js:114:11)\n at /var/lib/openshift/544ecf5f4382ec1dcc0002ec/app-root/runtime/repo/node_modules/loopback-connector-mongodb/node_modules/mongodb/lib/mongodb/cursor.js:700:54\n at Cursor.close (/var/lib/openshift/544ecf5f4382ec1dcc0002ec/app-root/runtime/repo/node_modules/loopback-connector-mongodb/node_modules/mongodb/lib/mongodb/cursor.js:989:5)\n at commandHandler (/var/lib/openshift/544ecf5f4382ec1dcc0002ec/app-root/runtime/repo/node_modules/loopback-connector-mongodb/node_modules/mongodb/lib/mongodb/cursor.js:700:21)\n at /var/lib/openshift/544ecf5f4382ec1dcc0002ec/app-root/runtime/repo/node_modules/loopback-connector-mongodb/node_modules/mongodb/lib/mongodb/db.js:1916:9\n at Server.Base._callHandler (/var/lib/openshift/544ecf5f4382ec1dcc0002ec/app-root/runtime/repo/node_modules/loopback-connector-mongodb/node_modules/mongodb/lib/mongodb/connection/base.js:448:41)\n at /var/lib/openshift/544ecf5f4382ec1dcc0002ec/app-root/runtime/repo/node_modules/loopback-connector-mongodb/node_modules/mongodb/lib/mongodb/connection/server.js:481:18\n at MongoReply.parseBody (/var/lib/openshift/544ecf5f4382ec1dcc0002ec/app-root/runtime/repo/node_modules/loopback-connector-mongodb/node_modules/mongodb/lib/mongodb/responses/mongo_reply.js:68:5)\n at null.<anonymous> (/var/lib/openshift/544ecf5f4382ec1dcc0002ec/app-root/runtime/repo/node_modules/loopback-connector-mongodb/node_modules/mongodb/lib/mongodb/connection/server.js:439:20)\n at emit (events.js:95:17)"
}
}
以下は、リクエストによってプロンプトが表示された mongodb ログ ファイルからの抜粋です。
Thu Oct 30 08:06:56.633 [conn9] assertion 16550 not authorized for query on <redacted>.ACL ns:<redacted>.ACL query:{ $query: { model: "Media", property: { $in: [ "find", "*" ] }, accessType: { $in: [ "READ", "*" ] } }, orderby: { _id: 1 } }
Thu Oct 30 08:07:13.949 [conn13] authenticate db: admin { authenticate: 1, user: "admin", nonce: "<redacted>", key: "<redacted>" }
Thu Oct 30 08:07:14.717 [conn13] command admin.$cmd command: { listDatabases: 1 } ntoreturn:1 keyUpdates:0 locks(micros) R:458 W:106047 r:48 reslen:285 136ms
Thu Oct 30 08:07:14.826 [conn13] command admin.$cmd command: { $eval: CodeWScope( function (){ return db.getCollectionNames(); }, {}), args: {} } ntoreturn:1 keyUpdates:0 locks(micros) W:106944 reslen:92 106ms
Thu Oct 30 08:07:14.918 [conn14] authenticate db: admin { authenticate: 1, user: "admin", nonce: "<redacted>", key: "<redacted>" }
Explorer インターフェイスを使用してコレクション内にリソースを作成しようとすると、同じエラーが発生します。認証しているユーザー名は admin であることに注意してください。これは、datasources.json に含めるユーザー名と資格情報ではありません。
{
"db": {
"name": "db",
"connector": "memory"
},
"cloudMongoDB": {
"host": "<redacted>",
"port": "27017",
"url": "mongodb://<redacted:27017/<redacted",
"username": "<not-user-admin>",
"password": "<redacted>",
"name": "cloudMongoDB",
"connector": "mongodb",
"database": "<redacted>"
}
}
紛らわしい要素の 1 つは、datasources.json で使用されるユーザー名と資格情報が管理者 (エラー ログに記載されている) ではなく、クエリ対象のコレクションを保持するデータベースの読み取り書き込みロールを持つ別のユーザーであることです。admin ユーザーは、openshift カートリッジのデフォルトに従ってセットアップされます。そのため、管理者ユーザーはターゲット データベースにアクセスできません。
データベースへのデータの追加を含め、datasources.json で使用したのと同じ資格情報を使用して、Mongo クライアント ツールからデータベースを参照できます。
そのため、datasources.json のユーザー名とパスワードは、Strongloop 認証に統合されていないようです。認証に資格情報を使用するには、資格情報を URL に明示的に追加する必要がありますか?
メッセージの意味を理解することに興味があります。エクスプローラー アプリケーションから MongoDB にアクセスするように StrongLoop を構成するには、どのようなユーザー管理手順を実行する必要がありますか?
MW
解決策の更新: datasources.json の URL を "mongodb://username:password@..." の形式に変更すると、StrongLoop は管理者以外のユーザーとして認証され、さらに先に進みます。私が持っていたロールにタイプミスが見つかりました。 (「最初に readwrite を許可していたのに対し、正しいロールは readWrite です」) ロールの定義を修正すると、MongoDB で StrongLoop エクスプローラーを使用できるようになりました。
次に、datasources.json から url パラメーターを削除したところ、StrongLoop がデータベース、ユーザー名、パスワードを使用して独自の URL を作成し、期待どおりに接続していることがわかりました。url フィールドがデータソース定義の他のフィールドをオーバーライドしているようです。今のところ、すべてが機能しています。