как правильно из php вызвать javascript mongodb функцию?

40 views
Skip to first unread message

prog45

unread,
Apr 3, 2014, 7:16:27 PM4/3/14
to mongodb-us...@googlegroups.com
в php вызываю mongodb javascript функцию start()

$username="root"; 
$password="root";
$mongo_uri="mongodb://".$username.":".$password."@localhost";
$connection = new MongoClient( $mongo_uri );
$db = $connection->test;

$response = $db->execute("start()");

echo "<pre>"; print_r($response); echo "</pre>";

в результате получаю

Array
(
    [ok] => 0
    [errmsg] => unauthorized
)

$username + $password + $mongo_uri - верные , и $db даёт "ок" коннект , функция start() в базе есть - все проверено,
но получаю ошибку unauthorized на $response = $db->execute("start()");


как правильно из php вызвать mongodb функцию start() ?

Serge Matveenko

unread,
Apr 4, 2014, 6:26:36 AM4/4/14
to mongodb-us...@googlegroups.com
Простым гуглением получаем ответ:
http://stackoverflow.com/questions/15694165/php-mongodb-driver-gives-unauthorized-error-when-running-mongodb-execute-wi

В кратце: execute вызывает eval на сервере, а для выполнения eval на
сервере нужны админские права, если на сервере включена
аутентификация.
> --
> You received this message because you are subscribed to the Google Groups
> "MongoDB по-русски" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to mongodb-user-rus...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.



--
Serge Matveenko
mailto: se...@matveenko.ru
github: http://lnkfy.com/1
linkedin: http://lnkfy.com/S

Пародуй.рф -- http://www.parodui.ru/
Специализированный магазин электронных сигарет
СПб, Ленинский проспект 79 корп. 3, +7 (812) 951-25-24
Message has been deleted

prog45

unread,
Apr 4, 2014, 6:54:19 AM4/4/14
to mongodb-us...@googlegroups.com
создал admina со всем возможными правами
roles: [ "read", "readWrite", "dbAdmin", "userAdmin", "clusterAdmin", "readAnyDatabase", "readWriteAnyDatabase", "userAdminAnyDatabase", "dbAdminAnyDatabase" ]
ошибка осталась

Vladimir Mukhin

unread,
Apr 4, 2014, 11:06:37 AM4/4/14
to mongodb-us...@googlegroups.com
Уточните, пожалуйста: пользователя “admin” вы создали в какой базе данных? Можете ли Вы подключиться к своей базе и посылать запросы из командной оболочки mongo?

--
Vladimir Mukhin @ MongoDB
> --
> You received this message because you are subscribed to the Google Groups "MongoDB по-русски" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to mongodb-user-rus...@googlegroups.com (mailto:mongodb-user-rus...@googlegroups.com).

Serge Matveenko

unread,
Apr 4, 2014, 11:13:59 AM4/4/14
to mongodb-us...@googlegroups.com
Собственно, да. Работает ли eval в командной оболочке mongo, если
авторизоваться под этим пользователем?
> To unsubscribe from this group and stop receiving emails from it, send an email to mongodb-user-rus...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.



prog45

unread,
Apr 4, 2014, 11:20:39 AM4/4/14
to mongodb-us...@googlegroups.com
в оболочке работает

prog45

unread,
Apr 4, 2014, 11:21:36 AM4/4/14
to mongodb-us...@googlegroups.com
все в одной бд

Vladimir Mukhin

unread,
Apr 4, 2014, 12:01:52 PM4/4/14
to mongodb-us...@googlegroups.com
T.e., бд “admin” или “test”? 

Для использования eval(), Вам нужно создать юзера-суперадмина (с привилегиями “readWriteAnyDatabase”, “adminAnyDatabase”, “userAdminAnyDatabase”, “clusterAdmin") в базе данных “admin”.

--
Vladimir Mukhin @ MongoDB


On Friday, April 4, 2014 at 11:21 AM, prog45 wrote:

все в одной бд

Vladimir Mukhin

unread,
Apr 4, 2014, 12:12:58 PM4/4/14
to mongodb-us...@googlegroups.com
А, и забыл добавить: оболочка, запускаемая на той же машине, что и сервер, попадает под “localhost exception”, т.е. юзер/пароль не проверяются. Попробуйте запустить удалённую оболочку на другой машине и проверить, работает ли.

-- 
Vladimir Mukhin @ MongoDB

prog45

unread,
Apr 4, 2014, 2:04:21 PM4/4/14
to mongodb-us...@googlegroups.com
так тоже не работает

Vladimir Mukhin

unread,
Apr 4, 2014, 3:14:53 PM4/4/14
to mongodb-us...@googlegroups.com
Значит, что-то где-то неправильно сконфигурено:

Попробуем ещё раз. Я предполагаю, что у Вас установлен сервер версии 2.4.x:

# Запускаем свежий сервер для тестирования, включаем auth, выключаем "localhost exception", чтобы можно было тестировать на одной и той же машине

$ mkdir /data/test
$ mongod --port 12345 --dbpath /data/test --auth --setParameter enableLocalhostAuthBypass=0

# Подсоединяемся

$ mongo --port 12345
MongoDB shell version: 2.4.6
connecting to: 127.0.0.1:12345/test

// Пробуем

> db.eval("db.foo.insert({ bar: 1 })");
Fri Apr 4 14:46:38.688 { "ok" : 0, "errmsg" : "unauthorized" } at src/mongo/shell/db.js:571

// Ага, не работает

> exit

# Пробуем снова, запускаемся без --auth, создаем юзера:

$ mongod --port 12345 --dbpath /data/test
$ mongo --port 12345

> use admin
> db.addUser({ user: "admin", pwd: "foobar1234", roles: [ "readWriteAnyDatabase", "dbAdminAnyDatabase", "userAdminAnyDatabase", "clusterAdmin" ] });
> db.system.users.count()
1

// Ок, юзер создан

> exit

# Перезапускаемся обратно с --auth

$ mongod --port 12345 --dbpath /data/test --auth --setParameter enableLocalhostAuthBypass=0 

# Подключаемся

$ mongo --port 12345 

MongoDB shell version: 2.4.6

connecting to: 127.0.0.1:12345/test

> db.eval("db.foo.insert({ bar: 1 })")

Fri Apr  4 14:49:46.356 { "ok" : 0, "errmsg" : "unauthorized" } at src/mongo/shell/db.js:571


// Ага, опять не работает. Теперь скажем пароль, предварительно перейдя в бд "admin":

> use admin
> db.auth('admin', 'foobar1234')
1
// идем обратно в test
> use test
> db.eval("db.foo.insert({ bar: 1 })")

null

> db.foo.find()

{ "_id" : ObjectId("533efdcef55b2b5522a75eec"), "bar" : 1 }


// Ура, работает.


> exit

# NB: Можно сразу передать параметры --username и --password команде "mongo", в таком случае следует указать название бд "admin" в командной строчке: 

$ mongo --port 12345 --username admin --password foobar1234 admin

MongoDB shell version: 2.4.6

connecting to: 127.0.0.1:12345/admin

> use test
> db.eval("db.foo.insert({ bar: 2 })")

null

> db.foo.find()



Теперь всё должно также работать из-под PHP драйвера.

 

Формат URI для MongoClient mongodb://admin:foobar1234@localhost опускает название базы данных, поэтому распознание пользователя происходит по бд "admin" по умолчанию, что и требуется.


Ещё раз повторюсь, важный момент: для работы с командой eval требуется распознание пользователя с привилегиями "readWriteAnyDatabase", "dbAdminAnyDatabase", "userAdminAnyDatabase", "clusterAdmin" в базе данных "admin".




--
Vladimir Mukhin @ MongoDB


On Friday, April 4, 2014 at 2:04 PM, prog45 wrote:

так тоже не работает

prog45

unread,
Apr 5, 2014, 1:43:22 AM4/5/14
to mongodb-us...@googlegroups.com
Владимир благодарю! Работает!
Reply all
Reply to author
Forward
0 new messages