mongo授权zend shanty

I trying to add authorization to mongoDB.

I use mongodb 2.2.4, php-mongo 1.4.1 stable, apache2, php 5.4, ZendFramework 1.12 + ShantyMongo

Also I use replicaset with 3 instances.

When I set auth = true mongo create admin database, and when I add user to this database I got this error:

Fatal error: Uncaught exception 'MongoCursorException' with message 'test.server.com:27017: unauthorized db:database_test ns:database_test.options lock type:0 client:127.0.0.1' in /apps/test_app/libs/Shanty/Mongo/Collection.php:3501

If I add user to my database_test all work fine.

<?php

/* Configure logging */
MongoLog::setModule( MongoLog::ALL );
MongoLog::setLevel( MongoLog::ALL );

$m = new MongoClient(); // connect
$db = $m->selectDB("database_test");
$db->authenticate('admin','12345');

this code work fine even if I add user to both admin and database_test.

Maybe someone has similar problem and know what I need to do.

First of all, you should use the following syntax for specifying authentication:

<?php
$m = new MongoClient("mongodb://admin:12345@localhost/database_test");
$db = $m->database_test;

It's a bit difficult to answer your question though, as "when I add user to this database" is not really descriptive. In order to get a proper answer, you need to learn to list the exact steps or code that you used to do this.

I am thinking that you were trying to auth against a normal database (database_test), where you would only have a user/pass set for the admin database. In that case, you need to auth to the admin database, and then select your database_test:

<?php
$m = new MongoClient("mongodb://admin:12345@localhost/admin");
$db = $m->database_test;

Thank you for your answer I figured out this. Maybe it's will be heplful for some one on future, Shanty-Mongo require username, password and port in array of servers. It's should looks like:

; Shanty Mongo Config
hosts.0.host = '127.0.0.1'
hosts.0.port = '27017'
hosts.0.username = 'root'
hosts.0.password = 'pass'
hosts.1.host = '127.0.0.1'
hosts.1.port = '27018'
hosts.1.username = 'root'
hosts.1.password = 'pass'
hosts.2.host = '127.0.0.1'
hosts.2.port = '27019'
hosts.2.username = 'root'
hosts.2.password = 'pass'
database = 'database_test'
replicaSet = true

Also what I do: in mongo: 1. edit config file, enable auth (auth = true) 2. create user in admin database 3. connect as new user 4. create user in target database in ZF config update config file, as I describe above.

Also some times I get error: Fatal error: php_network_getaddresses, I think it's because I have some trouble with DNS or php trying resolve address: mongo://root:pass@127.0.0.1:27017,root:pass@127.0.0.1:27018,root:pass@127.0.0.1:27019/database_test