Bootstrap

mgo 连接需要授权登录的mongodb

mgo 连接需要授权登录的mongodb

使用golang mgo连接到需要授权登录的mongodb

  • 测试环境
  • mongodb设置
  • golang mgo环境
  • 用例代码

搭建测试环境

windows 7, virtualbox, ubuntu 16.04LTS
  1. 安装[virtualbox]
  2. 安装虚拟机[ubuntu]
  3. 安装golang

    sudo apt-get update
    sudo apt-get install golang
    
  4. 安装mongodb

    sudo apt-get install mongodb
    mogod --version
    

    db version v2.6.10
    2016-09-29T16:54:46.199+0800 git version: nogitversion
    2016-09-29T16:54:46.200+0800 OpenSSL version: OpenSSL 1.0.2g 1 Mar 2016

mongodb设置

上面步骤安装mongdb结束之后会自动启动

ps -aef | grep mongod

mongodb 626 1 0 01:05 ? 00:05:01 /usr/bin/mongod –config /etc/mongodb.conf

可以看到mongod使用 /etc/mongdb.conf启动

sudo vi /etc/mongodb.conf

1 # mongodb.conf
2
3 # Where to store the data.
4 dbpath=/var/lib/mongodb
5
6 #where to log
7 logpath=/var/log/mongodb/mongodb.log
8
9 logappend=true
10
11 bind_ip = 192.168.6.1
12 port = 27017
13
14 # Enable journaling, http://www.mongodb.org/display/DOCS/Journaling
15 #journal=true
16
17 # Enables periodic logging of CPU utilization and I/O wait
18 #cpu = true
19
20 # Turn on/off security. Off is currently the default
21 #noauth = true
22 auth = true

上面是我修改后的,改动了bind_ip, auth
但是改动之前,需要首先建立一个管理员账号,否则auth实际上是不起作用的

使用mongo连接本机数据库,添加管理员账号

mongo
use admin
db.addUser({user:"username",
            pwd: "yourpassword",
            roles: [ "userAdminAnyDatabase",
                     "dbAdminAnyDatabase",
                     "readWriteAnyDatabase"
                   ]
           })
quit()
sudo service mongodb stop

这样在添加了管理员账号之后,将默认方式启动的mongodb服务停止

ps -aef | grep mongodb

修改 /etc/mongodb.conf
如果bind_ip 127.0.01 只能本虚拟机访问
可以更改默认数据库文件目录,但是需要保证mongodb有权限rw
最重要的需要把auth=true

service mongodb start
mongo -u "useryouadd" --authenticationDatabase admin -p

输入刚刚设置的密码,看看是否可以连接上

golang mgo环境

sudo apt-get install golang
cd
mkdir GoTest
export GOPATH=`pwd`
go get gopkg.in/mgo.v2
echo "export GOPATH=`pwd`"

上面命令执行结束,golang,mgo都已经安装好了

用例代码

cd $GOPATH
mkdir mtest
cd mtest

mgo 提供了几个建立session的接口,我使用了DialWithInfo

package main

import (
    "fmt"
    "gopkg.in/mgo.v2"
    "gopkg.in/mgo.v2/bson"
    "time"
)

func main() {
    dialInfo := &mgo.DialInfo{
        Addrs:     []string{"192.168.6.122"},
        Direct:    false,
        Timeout:   time.Second * 1,
        Database:  "yourdatabase",
        Source:    "admin",
        Username:  "username",
        Password:  "password",
        PoolLimit: 4096, // Session.SetPoolLimit
    }
    session, err := mgo.DialWithInfo(dialInfo)
    if nil != err {
        panic(err)
    }
    defer session.Close()
}

下一步就是CRUD

未完...
;