Мне нужно ограничить несколько пользователей MongoDB определенными коллекциями с некоторыми конкретными разрешениями на действия (только коллекция обновлений). В соответствии с документы это возможно.
localhost:tmp username$ mongo
MongoDB shell version v3.4.1
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.1
Server has startup warnings:
2018-05-06T15:30:51.739+0530 I CONTROL [initandlisten]
2018-05-06T15:30:51.772+0530 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2018-05-06T15:30:51.772+0530 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2018-05-06T15:30:51.772+0530 I CONTROL [initandlisten]
>
>
>
> use foo
switched to db foo
> db.inventory.insertOne( { item: "canvas", qty: 100, tags: ["cotton"], size: { h: 28, w: 35.5, uom: "cm" } } )
{
"acknowledged" : true,
"insertedId" : ObjectId("5af6c7e058d94deb0777e883")
}
>
>
>
> db.inventory.find( { item: "canvas" } )
{ "_id" : ObjectId("5af6c7e058d94deb0777e883"), "item" : "canvas", "qty" : 100, "tags" : [ "cotton" ], "size" : { "h" : 28, "w" : 35.5, "uom" : "cm" } }
>
>
>
> show collections
inventory
> db.createRole({ role: "fooRole", privileges: [ { resource: { db: "foo", collection: "inventory" }, actions: [ "find", "update" ] } ], roles: [] })
{
"role" : "fooRole",
"privileges" : [
{
"resource" : {
"db" : "foo",
"collection" : "inventory"
},
"actions" : [
"find",
"update"
]
}
],
"roles" : [ ]
}
>
>
>
>
> db.createUser({ user: "foouser", pwd: "foopass", roles: [ { role: "fooRole", db: "foo" } ] })
Successfully added user: {
"user" : "foouser",
"roles" : [
{
"role" : "fooRole",
"db" : "foo"
}
]
}
>
>
>
bye
Вход в систему как пользователь,
localhost:tmp username$ mongo -u "foouser" -p "foopass" --authenticationDatabase "foo"
MongoDB shell version v3.4.1
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.1
Server has startup warnings:
2018-05-06T15:30:51.739+0530 I CONTROL [initandlisten]
2018-05-06T15:30:51.772+0530 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2018-05-06T15:30:51.772+0530 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2018-05-06T15:30:51.772+0530 I CONTROL [initandlisten]
>
>
> use foo
switched to db foo
> show collections
inventory
> db.inventory.drop()
true
> show collections
> db.dropDatabase()
{ "dropped" : "foo", "ok" : 1 }
>
bye
Если кратко рассказать, что я сделал выше,
db.createRole({ role: "fooRole", privileges: [ { resource: { db: "foo", collection: "inventory" }, actions: [ "find", "update" ] } ], roles: [] })
db.createUser({ user: "foouser", pwd: "foopass", roles: [ { role: "fooRole", db: "foo" } ] })
Почему не работает ?. Зачем foouser
может сбросить сборник и базу данных? Я что-то не так делаю? Пожалуйста, предложите какое-нибудь решение !.
Несмотря на то, что вы создали пользователей, предупреждение о запуске в вашем стенограмме указывает, что вы не включили контроль доступа:
** WARNING: Access control is not enabled for the database.
** Read and write access to data and configuration is unrestricted.
Как и в MongoDB 3.6, контроль доступа должен быть явно включен с помощью security.authorization
параметр конфигурации или --auth
параметр командной строки.
Полные инструкции см. В Включить аутентификацию в руководстве MongoDB.