MongoDB笔记(二)访谈权限

1.3版本的连接管理

在1.3版本中,连接管理做了异常的大改观。每一种worker进度(线程、PHP-FPM或Apache
worker卡塔尔(قطر‎中,驱动把连接管理和Mongo*对象分别,减弱驱动的复杂度。下边以单个节点的MongoDB实例来注脚驱动如什么地点理连接。

当一个worker进度运营,MongoDB驱动会为之初叶化连接管理器管理总是,并且暗中同意没有连接。

在首先个须求调用new
MongoClient(卡塔尔;时,驱动创设多个新连接,何况以三个哈希值标记那几个三番五次。这一个哈希值包蕴以下参数:主机名、端口,进程ID和可选的replica
set名,假如是密码验证的连天,则还包蕴数据库名、客商名和密码的哈希值(对于密码验证的接连,大家后边再详尽研商)。调用MongoClient::getConnections(卡塔尔国方法,能够查阅连接对应的哈希值:

<?php
$m = new MongoClient( 'mongodb://whisky:27017/' );
var_dump( $m->getConnections()[0]['hash'] );
?>

输出:

string(22) “whisky:27017;-;X;22835″

输出中的”-”表示该连接不归于某些replica
set,”X”是从未有过客商名、数据库和密码时的占位符,22835是眼前历程的进度ID。

然后该连接会在三回九转微处理器中注册: 图片 1

在供给连接的任何时候,包括插入、删除、更新、查找或实施命令,驱动都会向微型机诉求三个适中的连天来实践。央浼连接时会用到new
MongoClient(卡塔尔(قطر‎的参数和当前路程的ID。每一种worker进度/线程,连接微机都会有一个老是列表,而各类PHP
worker同不常刻,只会运作三个伸手,因而和种种MongoDB之间只须求二个连接,不断重用,直到PHP
worker终止或显式调用MongoClient::close(卡塔尔关闭连接。


4、最初实施那么一下

申明的连天

一旦MongoDB启用验证成效,那么连接的哈希值会蕴藏验证相关的哈希值。那样分歧脚本,使用区别的客商名、密码连接同三个MongoDB上的不等的数据库时,能够互为区分,而不会误用连接。上边示例使用admin客户名连接admin数据库,然后观望hash值的变迁:

<?php
$m = new MongoClient( 'mongodb://admin:admin@whisky:27017/admin' );
var_dump( $m->getConnections()[0]['hash'] );
?>

输出:

string(64)
“whisky:27017;-;admin/admin/bda5cc70cd5c23f7ffa1fda978ecb class=”wp_keywordlink”>D30;8697″

早先示例中的”X”部分已经替换为二个带有数据库名admin、顾客名admin和哈希值bda5cc70cd5c23f7ffa1fda978ecbd30,该哈希值是依照客户名、数据库名和密码哈希值计算得来。

为了验证能够正确职业,需求在连年字符串中带有数据库名,不然会默以为admin。

在创立连接后要利用数据库,须求先选拔该数据库,如:

$collection = $m->demoDb->collection; $collection->findOne();

若是选拔的数据库是延续字符串中钦点的数据库,大概一连字符串中的数据库是admin,那么一切都会平常运作。不然,驱动会创制一个新的接连几天,进而防守验证被绕过,如下所示:

<?php
$m = new MongoClient( 'mongodb://user:user@whisky:27017/test' );

$db = $m->test2;
$collection = $db->collection;
var_dump( $collection->findOne() );
?>

输出:

Fatal error: Uncaught exception ‘MongoCursorException’ with message
‘whisky:27017: unauthorized db:test2 ns:test2.collection lock type:0
client:127.0.0.1′ in …/mongo-connect-5.php.txt:6

因为大家的三番四遍并未实行test2数据库的授权验证,因此退步。假设大家施行验证,就能够健康运作:

<?php
$m = new MongoClient( 'mongodb://user:user@whisky:27017/test' );

$db = $m->test2;
$db->authenticate('user2', 'user2' );
$collection = $db->collection;
$collection->findOne();

foreach ( $m->getConnections() as $c )
{
    echo $c['hash'], "\n";
}
?>

输出:

whisky:27017;-;test/user/602b672e2fdcda7b58a042aeeb034376;26983
whisky:27017;-;test2/user2/984b6b4fd6c33f49b73f026f8b47c0de;26983

近期微型机中有五个已表达的连接:

图片 2

顺手提一句,倘若您展开了E_DEPRECATED级其余错误提示,则拜访到:

Deprecated: Function MongoDB::authenticate() is deprecated in
…/mongo-connect-6.php.txt on line 5

使得建议通过创制四个MongoClient对象完毕该类职分:

<?php
$mTest1 = new MongoClient( 'mongodb://user:user@whisky:27017/test', array( 'connect' => false ) );
$mTest2 = new MongoClient( 'mongodb://user2:user2@whisky:27017/test2', array( 'connect' => false ) );

$mTest1->test->test->findOne();
$mTest2->test2->test->findOne();

foreach ( $mTest2->getConnections() as $c )
{
    echo $c['hash'], "\n";
}
?>

单个MongoDB服务器能帮忙的现身连接一定轻易,假使应用PHP-FPM的话,每一种worker进度有温馨独立的连接池,那么相当的轻松达成连接数的上限。由此,在生育情况中,不管有未有使用复制集,都要配备mongos,然后PHP-FPM连接mongos,那样能够减小mongod的连接数,并且PHP-FPM和mongos之间能够接收短连接(即每种央浼停止时都显式调用close函数关闭MongoDB连接State of Qatar。

示例2:

 5、多少个简易的劳务安装、服务卸载以至客户登陆实例

Replica sets

在存在复制集的情状中,意况有一点点分歧。new
MongoClient(卡塔尔(قطر‎的延续字符串中,要求内定三个hosts,并标示当前正值实用复制集:

$m = new
MongoClient(“mongodb://whisky:13000,whisky:13001/?replicaSet=seta”);

此中的replicaSet参数不可能大约,否则驱动会以为你是希图连接几个差别的mongos进度。

在实例化时,驱动会检查复制集的拓扑布局。上面例子的输出,展现在调用new
MongoClient(卡塔尔(قطر‎之后,复制聚集具备可以预知的数码节点都会在微型机中注册叁个连连:

<?php
$m = new MongoClient( 'mongodb://whisky:13001/?replicaSet=seta' );
foreach ( $m->getConnections() as $c )
{
    echo $c['hash'], "\n";
}
?>

输出:

whisky:13001;seta;X;32315 whisky:13000;seta;X;32315

即便三回九转字符串中未有whisky:13000节点,可是微机中早已登记了多个三番五次:

图片 3

微型机不只有含有连接的哈希值和TCP/IP
socket,还保留哪个节点是主节点,以致各类节点的“间隔”。上面包车型客车脚本展现了这么些额外的消息;

<?php
$m = new MongoClient( 'mongodb://whisky:13001/?replicaSet=seta' );
foreach ( $m->getConnections() as $c )
{
    echo $c['hash'], ":\n",
        " - {$c['connection']['connection_type_desc']}, ",
        "{$c['connection']['ping_ms']} ms\n";
}
?>

输出:

whisky:13001;seta;X;5776: – SECONDARY, 1 ms whisky:13000;seta;X;5776:
– PRIMARY, 0 ms

使得把操作分为两种档期的顺序:写操作,富含插入、更新、删除和下令;读操作,包罗find和findOne。私下认可情形下,若无安装读偏疼参数,微型机会一向重回主节点的连续几天。读偏疼参数能够经过setSlaveOkay(卡塔尔(قطر‎设置,也得以在接连字符串中设置:

$m = new MongoClient("mongodb://whisky:13000,whisky:13001/?replicaSet=seta&readPreference=secondaryPreferred");

足够那些参数后,连接字符串变得相当短,由此PHP驱动允许将选拔放在数组中,作为第二个参数字传送入:

$options = array(
        'replicaSet' => 'seta',
        'readPreference' => 'secondaryPreferred',
);
$m = new MongoClient("mongodb://whisky:13000,whisky:13001/", $options);

对于每一个操作,驱动向微处理器诉求获取叁个适逢其时的连年。对于写操作,会直接重回主节点的总是;对于读操作,假设协理节点可用且“间隔”不远的话,则会回到该帮衬节点的连接。

得到数据库test的users集结,不用忧郁users集合是还是不是存在,若不设有该集合,程序会在数据库中机动创制。如下:

 

1.2版本的接连几日管理

1.2版本的驱动引进了连接池,在实行其它查询时,都会从连接池中呼吁贰个连连,达成之后再归还给连接池。这里的到位是指装有该连接的变量离开了它的功能域,下边是三个演示。

最简易的版本:

<?php
$m = new MongoClient();    // ← 从连接池请求连接
$c = $m->demo->test;
$c->insert( array( 'test' => 'yes' ) );
?>

← $m离开效用域,连接归还给连接池

在函数中:

<?php
function doQuery()
{
        $m = new MongoClient();    // ← 从连接池请求连接
        $c = $m->demo->test;
        $c->insert( array( 'test' => 'yes' ) );
} // ← $m离开作用域,连接归还给连接池
?>

在某个景况下,系统可能会发出大量的连天,比方在ORMs/ODMs的某部复杂构造中引用连接对象,如下例子:

<?php
for ( $i = 0; $i < 5; $i++ )
{
        $conns[] = new MongoClient();
}// ← 现在有5个连接
?>

万一开发银行了应用服务器(Apache、WAMPP等),需求重启,后一次运转PHP时会活动加载Mongo扩张。

2、既然要输入客商名和密码来扩充授权,那么这么些客商名和密码是何等来的呢?
  
暗中同意境况下,数据库中是从未客户名和密码的,所以即使在拉开服务时展开了权力决定,也是不要求任何客户名和密码就能够访谈每一个数据库。那也是必需的,因为我们要给数据库设置密码就务供给先能够访谈数据库,这时候就足以对大家的一级助理馆员某数据库助理馆员设置客户名和密码。

1.3版本的PHP MongoDB
driver重写了一连管理库,和早前版本对照,在长久连接和连接池方面,都有了最首要的变迁。

到官方网站下载和PHP版本、VC版本和线程安全相匹配的包,解压后,将php_mongo.dll移动到extension_dir目录。

    由地点的两条开启服务的下令来看,是由运转命令mongod的参数
-auth决定,如若不张开,那么对数据库都能够访谈。若是展开,那么就须求输入客户名和密码(-auth(‘客户’,’密码’卡塔尔(قطر‎卡塔尔(قطر‎来扩充授权,假若不易的则赶回1,不然再次来到0

1 $cursor = $collection->find();  2   3 foreach ($cursor as $value)  4   5 {  6   7          echo $value[‘username’] . ‘<br/>’;  8   9 }
  1. 安装:mongod -dbpath=D:/MongoDB/Data
  2. 安装:mongod -dbpath=D:/MongoDB/Data
    -logpath=D:/MongoDB/Log/test.log
  3. 安装:mongod -dbpath=D:/MonogDB/Data
    -logpath=D:/MongoDB/Log/test.log -logappend
  4. 安装:mongod -dbpath=D:/MonogDB/Data
    -logpath=D:/MongoDB/Log/test.log -logappend -fork
    卸载:db.shutdownServer()
    如上的cmd中的shell连接:mongo 大概mongo admin(钦点的数据库名称卡塔尔(قطر‎
                          C#连接:mongodb://localhost
  5. 安装:mongod -dbpath=D:/MongoDB/Data
    -logpath=D:/MongoDB/Log/test.log  port 2222 -install
    开启:net start MongoDB
    关闭:net stop MongoDB
    卸载:mongod -dbpath=D:/MongoDB/Data
    -logpath=D:/MongoDB/Log/test.log  port 2222 -remove
    一声令下连接:mongo 127.0.0.1:2222或mongo
    127.0.0.1:2222/admin(即:数据库名称卡塔尔
     c#连接:mongodb://127.0.0.1:2222或Server=127.0.0.1:2222
  6. 安装:mongod -dbpath=D:/MongoDB/Data
    -logpath=D:/MongoDB/Log/test.log  port 2222  -auth -install
    与5类似
    一声令下连接:
     
    c#连续几天来:mongodb://客商名:密码@localhost:2222   登入后将暗中同意使用admin数据库
              mongodb://顾客名:密码@localhost:2222/admin(即:数据库名称State of Qatar

 

id=”articlecontent”>以下列出的uri样式并非被所有的数据库驱动所支持,请参考各驱动自己的文档,查看各驱动支持的连接字符串uri形式。如果下面的样式不支持,那么驱动会有自己的指定连接的替代方式。

id=”articlecontent”>mongodb:``//[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]

id=”articlecontent”>mongodb:``// 是一个必填的前缀,它标识当前字符串是标准连接格式。
id=”articlecontent”>{{username:password@}}可选。给出用户名和密码后,驱动将在连接到数据库后尝试登录。host1 uri里唯一的必填项,数据库的连接地址。
:portX 可选。默认连接到27017端口。
id=”articlecontent”>/database 是希望连接到的数据库名,只有在提供 username:password@ 后该值才有效。如果不指定,默认将连接``"admin"``数据库。 id=”articlecontent”>可以任意指定多个数据库和端口,这用于实现连接到replica pairs/sets。可选项options有:
  connect=direct|replicaset
   id=”articlecontent”>direct: 直接建立一个到服务器的连接。如果指定了多个host,将按先后顺序挨个尝试建立连接,直到连接建立成功为止。如果只指定了一个host,则 direct 为默认值。
   id=”articlecontent”>replicaset: 使用creplica ``set semantics建立连接(即使只提供了一个host)。指定的host作为种子列表来查找完整的replica``set``。当指定多个host时 replicaset 为默认值。
  replicaset=name
   id=”articlecontent”>驱动验证建立连接的replica ``set``的名字。隐含 connect=replicaset。
   id=”articlecontent”>slaveok=``true``|``falseo     ``true``: 对于 connect=direct 模式,驱动对列表中的第一个服务器建立连接,即使它不是主服务器。对 connect=replicaset 模式,驱动将所有写操作发送到主节点,将所有读操作按round robin顺序分发到从节点。
   id=”articlecontent”>false``: 对 connect=direct 模式,驱动按顺序尝试所有host直到找到主节点。对 connect=replicaset 模式,驱动将只连接到主节点,并将所有读操作和写操作都发送到主节点。 id=”articlecontent”>safe=``true``|``false
  true: 驱动在每回换代操作后都发送 getlasterror
命令以确认保障更新成功(参照他事他说加以考察 w 和 wtimeout)。
  false: 驱动每一遍换代操作后不发送 getlasterror 命令。

   w=no   
  驱动给 getlasterror 发送 { w : n } 命令。隐含 safe=true。

   wtimeout=ms
  驱动给 getlasterror 添加 { wtimeout : ms } 参数。隐含
safe=true。

  fsync=true|false
  true: 驱动给 getlasterror 添加 { fsync : true } 参数。隐含
safe=true。
  false: 驱动不增加 fsync 参数。

 

连接示例

连接到一个运行在本机默认端口(27017)的MongoDB
mongodb://localhost
连接到一个运行在本机默认端口(27017)的MongoDB,并以用户名"fred"和密码"foobar"登录,登录后将默认使用admin数据库
mongodb://fred:foobar@localhost
连接到一个运行在本机默认端口(27017)的MongoDB,并以用户名"fred"和密码"foobar"登录,登录后将使用baz数据库
mongodb://fred:foobar@localhost/baz
连接到一个replica pair,一台服务器在example1.com,另一台在example2.com
mongodb://example1.com:27017,example2.com:27017
连接到本机的一个replica set(端口分别为27017,27018,27019)
mongodb://localhost,localhost:27018,localhost:27019
连接到三台服务器的replica set,将所有写操作发送到主节点,所有读操作分发到从节点
mongodb://host1,host2,host3/?slaveok=true
连接到第一台服务器并响应,无论它是replica set的一台,也无论它是主节点还是从节点
mongodb://host1,host2,host3/?connect=direct;slaveok=true
注:这种类型的连接字符串可用于在你偏好使用某台服务器但有可供替换的服务器的时候。
使用safe模式连接到本机
mongodb://localhost/?safe=true
使用safe模式连接到replica set,等待备份在至少两台机器上完成,timeout时间为2秒
mongodb://host1,host2,host3/?safe=true;w=2;wtimeout=2000

 

给users集合中创制目录:

1、启用权限调整(-auth),当启用MongoDB数据库服务时,对参数的设置能够垄断是不是启用权限调控
   不开启: mongod -dbpath=D:/MongoDB/Data
-logpath=D:/MongoDB/Log/test.log
    开启: mongod -dbpath=D:/MongoDB/Data
-logpath=D:/MongoDB/Log/test.log -auth

1 $connection = new Mongo(‘example.com’);    //连接到example.com:27017  2 $connection = new Mongo(‘example.com:65432‘);          //连接到example.com:65432

3、一流管理员和某数据库的领队
  
一级管理员正是在admin数据库中丰裕的顾客名和密码(能够查阅数据库列表什么的….)
   某数据库管理员也便是对各类数据库增加客商名和密码

示例5:

  1. 敞开服务(启用权限调整State of Qatar
    mongod -dbpath=D:/MongoDB/Data
    -logpath=D:/MongoDB/Log/test.log -auth
    图片 4
  2. 暗许未有客户名和密码的景色下是能够访问放肆数据库的
    图片 5
  3. 在这里此情景下,创设二个精品管理员
    输入:use admin
    输入:db.addUser(‘sa’,’123′)
    下一场再拜谒admin数据库试试,就能够忍俊不禁错误提醒,这是正是因为急需客商授权,当输入客户名和密码来授权之后,就OK
    图片 6
  4. 此刻按Ctrl+C退出,然后再步入,用刚刚创办的客商去做客admin以外的数据库,举例:test
    用admin创建的至上管理员没辙直接访谈其余数据库,可是足以直接的去会见。
    图片 7
  5. 行使一级管理员直接的去会见大肆数据库,直接的去拜访正是先通过授权踏入admin数据库,然后再由admin数据库步入此外数据库
    即:以admin数据库为跳板,再进来其它数据库
    图片 8
  6. 为数据库增添客户名和密码,各个数据库都得以加上直接访问此库的客商和密码,並且是存放在在本库的system.users表中的
    为test数据库创设直接访问客商:客户名=test     密码=123
    图片 9
  7. 继续第6步,按Ctrl+C退出,再度走入test数据库,并输入第6步中为test数据库创造的第一手访谈顾客和密码来开展授权
    图片 10

    旗开马到….
    那会儿有未有对数据库的权力难题有了些了然吗?

1 $user = array(“username” => “cx”, “age” => 23);  2   3 $collection->insert($user);

要寻访数据库,那么对寻访权限的装置是必得的!

1 $connection = new Mongo(‘cx:123456@example:65432/test’);

输出users群集中率先个文书档案的id号:

示例1:

出口全部客商的名字:

Mongo类就是二个到数据库的连接。暗中认可情状下,结构器尝试连接本地私下认可端口处运转的数据库服务器。MongoDB中的文书档案用PHP中的关联数组表示,{“foo”
: “bar”}对应PHP中的array(“foo” =>
“bar”卡塔尔(قطر‎。MongoDB中的数组对应代表为PHP中的数组,[“foo”, “bar”,
“baz”]对于PHP中的array(“foo”, “bar”,
“baz”卡塔尔(قطر‎。对于null、布尔型、数字型、字符串和数组,PHP驱动使用了PHP的本机类型。对于别的体系,可参照手册。

或者

相关文章