默认情况下,MongoDB实例启动运行时是没有启用用户访问权限控制的,也就是说,在实例本机服务器上都可以随意登录实例进行各种操作,MongoDB不会对连接客户端进行用户验证,可以想象这是非常危险的。MongoDB使用的是基于角色的访问控制(Role-Based Access Control,RBAC)来管理用户对实例的访问,角色控制2.4开始引入,详情链接,通过对用户授予一个或多个角色来控制用户访问数据库资源的权限和数据库操作的权限,在对用户分配角色之前,用户无法访问实例。本文记录一下mongodb的权限管理。
MongoDB内部提供了一系列内置的角色,这些角色是为了完成一些基本的数据库操作。每个内置角色提供了用户在角色数据库内数据库级别所有非系统类集合的访问权限,也提供了对集合级别所有系统集合的访问权限。MongoDB在每个数据库上都提供内置的数据库用户角色和数据库管理角色,但只在admin数据库中提供其它的内置角色。
内置角色主要包括以下几个类别:
数据库用户角色(Database User Roles)
数据库管理角色(Database Administration Roles)
集群管理角色(Cluster Administration Roles)
备份和恢复角色(Backup and Restoration Roles)
全数据库级角色(All-Database Roles)
超级用户角色(Superuser Roles)
内部角色(Internal Role)
角色 | 权限描述 |
---|---|
read | 可以读取指定数据库中任何数据。 |
readWrite | 可以读写指定数据库中任何数据,包括创建、重命名、删除集合。 |
readAnyDatabase | 可以读取所有数据库中任何数据(除了数据库config和local之外)。 |
readWriteAnyDatabase | 可以读写所有数据库中任何数据(除了数据库config和local之外)。 |
dbAdmin | 可以读取指定数据库以及对数据库进行清理、修改、压缩、获取统计信息、执行检查等操作。 |
dbAdminAnyDatabase | 可以读取任何数据库以及对数据库进行清理、修改、压缩、获取统计信息、执行检查等操作(除了数据库config和local之外)。 |
clusterAdmin | 可以对整个集群或数据库系统进行管理操作。 |
userAdmin | 可以在指定数据库创建和修改用户。 |
userAdminAnyDatabase | 可以在指定数据库创建和修改用户(除了数据库config和local之外)。 |
1. 登陆管理员用户root
# 管理员用户登陆,admin库
> mongo -u "root" -p "Bw4diGTu6eMYVVD6" admin
2. 查看所有的数据库列表
> show dbs
admin 0.000GB
local 0.000GB
查看用户,这个是针对莫一个数据库的
> show users
3. 创建数据库/创建针对该数据库的读写用户
> use test1
> db.createCollection("test.com.cn")
> db.createUser({user:"testuser1",pwd: "testuser1",roles: [{ role: "readWrite", db: "test1"}]})
4. 命令行登陆新创建的数据库
$ mongo -u "testuser1" -p "testuser1" test1
> show tables
5. 删除数据库(该操作需要在管理员账户下进行)
$ mongo admin
> db.auth("root","Bw4diGTu6eMYVVD6")
> use test1
> db.dropDatabase()
6. 删除数据库用户(在自己的权限下无法删除自己)
$ mongo admin
> db.auth("root","Bw4diGTu6eMYVVD6")
> db.system.users.find({user:'testuser1'})
> use test1
> db.dropUser('testuser1')
1. 使用:gopkg.in/mgo.v2
获取包:go get gopkg.in/mgo.v2
引入:import "gopkg.in/mgo.v2"
2. 代码
package main
import (
"gopkg.in/mgo.v2"
"math/rand"
"time"
"github.com/golang/glog"
"github.com/pkg/errors"
)
type Administrators struct {
Name string
}
//通过管理员用户和密码来创建其他数据库并赋予新用户仅仅针对该数据库的读写权限
func CreateMongoDatabase(rootUser, rootSecret, dbHost, newUser, newPassword, newDbName string) error {
var url string
//style: [mongodb://][user:pass@]host1[:port1][,host2[:port2],...][/database][?options]
url = "mongodb://root:" + rootSecret + "@" + dbHost + "/" + "admin"
//建立与mongodb的连接,并创建新数据库,给新数据库添加新用户。
for i := 0; i < 10; i++ {
time.Sleep(5 * time.Second)
glog.Infof("try to connect mongodb now !")
//建立连接
session, err := mgo.Dial(url)
defer session.Close()
if err != nil {
glog.Warningf("connect mongodb err: %q ", err)
continue
}
//创建新数据库,并写入一个特定集合(注意:如果不写入特定集合的话,创建的数据库因为无数据其实退出之后数据库也就不在了)
glog.Infof("create database %s, create collection test.com.cn", newDbName)
client := session.DB(newDbName).C("test.com.cn")
//插入集合
err = client.Insert(&Administrators{"test.com.cn"})
if err != nil {
glog.Warningf("insert collection test.com.cn err: %q ", err)
continue
}
glog.Infof("create database %s complete", newDbName)
//初始化新数据库的结构体
db := mgo.Database{
Session: session,
Name: newDbName,
}
//给用户信息赋初值
userInfo := &mgo.User{
Username: newUser,
Password: newPassword,
Roles: []mgo.Role{mgo.RoleReadWrite},
}
if userInfo != nil {
glog.Infof("start adding users:%s to database:%s", newUser, newDbName)
//插入用户
err = db.UpsertUser(userInfo)
if err != nil {
glog.Warningf("adding users:%s to database:%s err: %q ", newUser, newDbName, err)
continue
}
glog.Infof("add user:%s to database:%s complete", newUser, newDbName)
}
return nil
}
return errors.New("making new mongodb Database err")
}
// Function for delete mongodb user
func DeleteMongoDBUser(rootUser, rootSecret, dbHost, newUser, databasebName string) error {
var url string
url = "mongodb://root:" + rootSecret + "@" + dbHost + "/" + "admin"
// glog.Infof("mongo url : %s", url)
session, err := mgo.Dial(url)
defer session.Close()
if err != nil {
glog.Warningf("session err: %q ", err)
return err
}
db := mgo.Database{
Session: session,
Name: databasebName,
}
glog.Infof("Delete mongodb user:%q on database:%q", newUser, databasebName)
err = db.RemoveUser(newUser)
if err != nil {
glog.Warningf("Delete mongodb user:%q on database:%q err: %q ", newUser, databasebName, err)
return err
}
return nil
}
// Function for creating a random string
func RandomString(strlen int) string {
rand.Seed(time.Now().UTC().UnixNano())
const chars = "abcdefghijklmnopqrstuvwxyz0123456789"
result := make([]byte, strlen)
for i := 0; i < strlen; i++ {
result[i] = chars[rand.Intn(len(chars))]
}
return string(result)
}
func main() {
var rootUser, rootSecret, dbHost, newUser, newPassword, newDbName string
rootUser := "root"
rootSecret := "123456"
dbHost := "127.0.0.1"
newUser := RandomString(8)
newPassword := RandomString(8)
newDbName := "test"
//此处的root用户和密码需要提前在数据库中设置好,通过以上信息我们可以创建一个指定名称的数据库并增加随机的用户名和密码
err = CreateMongoDatabase(rootUser, rootSecret, dbHost, newUser, newPassword, newDbName)
if err != nil {
glog.Warningf("create mongodb database err: %q ", err)
}
glog.Infof("new users:%s ,new password:%s for database:%s", newUser, newPassword, newDbName)
//删除创建的用户
// err = DeleteMongoDBUser(rootUser, rootSecret, dbHost, newUser, newDbName)
// if err != nil {
// glog.Warningf("delete mongodb user err: %q ", err)
// }
}
1.https://www.cnblogs.com/dbabd/p/10811523.html
2. https://cloud.tencent.com/developer/article/1532340