关于mongodb的权限

所谓权限,就是开启认证,从而确定一个用户是否能访问某一个库,因此和用户是分不开的。默认情况下,mongodb是没开启认证的,也没有用户。这样肯定是不安全的,因此我们要开启认证,同时还要配置用户。

用户

mongodb的用户有一下几个特点:

  1. 用户是分角色的,有内置角色,也可以自定义角色
  2. 用户是和库绑定的,登录认证的时候也要在对应的库中认证
  3. 一般需要先创建管理员账号,然后再开启服务端认证

常见内置角色说明

  1. 数据库用户角色(Database User Roles)

    read :授权用户只读数据的权限,允许用户读取指定的数据库

    readWrite: 授权用户“读/写”数据的权限,允许用户“读/写”指定的数据库

  2. 数据库管理角色(Database Admininstration Roles)

    dbAdmin:在当前的数据库中执行管理操作,如索引的创建、删除、统计、查看等
    dbOwner:在当前的数据库中执行任意操作,增、删、改、查等
    userAdmin:在当前的数据库中管理用户,创建、删除和管理用户。

  3. 备份和还原角色(Backup and Restoration Roles)

    backup:备份角色
    restore:还原角色

  4. 可跨库角色(All-Database Roles)

    readAnyDatabase:授权在所有的数据库上读取数据的权限,只在admin 中可用
    readWriteAnyDatabase:授权在所有的数据库上读写数据的权限,只在admin 中可用
    userAdminAnyDatabase:授权在所有的数据库上管理用户的权限,只在admin中可用
    dbAdminAnyDatabase: 授权管理所有数据库的权限,只在admin 中可用

  5. 集群管理角色(Cluster Administration Roles)

    clusterAdmin:授权管理集群的最高权限,只在admin中可用
    clusterManager:授权管理和监控集群的权限
    clusterMonoitor:授权监控集群的权限,对监控工具具有readonly的权限
    hostManager:管理server

  6. 超级角色(super master Roles)

    root :超级账户和权限,只在admin中可用

创建用户

# 第二个参数是可选的
db.createUser(user, writeConcern)

第一个参数user的格式是这样的:

{
  user: "<name>",
  // Or  "<cleartext password>"
  pwd: passwordPrompt(),
  customData: { <any information> },
  roles: [
    { role: "<role>", db: "<database>" } | "<role>",
  ],
  authenticationRestrictions: [
     {
       clientSource: ["<IP>" | "<CIDR range>",],
       serverAddress: ["<IP>" | "<CIDR range>",]
     },
  ],
  mechanisms: [ "<SCRAM-SHA-1|SCRAM-SHA-256>",],
  passwordDigestor: "<server|client>"
}

常见的配置项有:

user:用户的名字(字符串类型)
pwd:用户的密码(字符串类型)
roles:用户的角色(数组类型)

使用案例1:

# 切换到xxx数据库
use xxx;
# 创建一个用户,账号为ss,密码为:123456,角色为:xxx库的readWrite
db.createUser({
		user:"ss",
		pwd: "123456",
		roles:["readWrite"]
});

使用案例2:

# 切换到yyy库
use yyy;
# 创建一个用户,账号为zs,密码为:654321,角色有多个,分别是:
# 1. yyy库中的readWrite角色
# 2. xxx库中的read角色
db.createUser({
    user : "zs",
    pwd : "654321",
    roles : [
    		# 这里虽然绑定的事xxx库,但是验证的时候也要在yyy库中进行
        { role : "read", db : "xxx" },
        "readWrite"
    ]
})

开启验证

方法1:使用配置文件
# 在配置文件中加入这段配置
auth=true

修改完配置后别忘了重启服务端

方法2:启动时候加入--auth
mongod --dbpath=/usr/local/mongodb/data/ --logpath=/usr/local/mongodb/logs/mongodb.log --logappend --port=27017 --fork --auth

执行验证

方法1:在数据库内验证
# 使用客户端连接到服务端
mongo

执行验证

# 切换到对应的数据库
use xxx
# 使用账号和密码验证(返回值1表示通过,0表示未通过验证)
db.auth('ss','123456');

注意:一次连接尽量只验证一个用户,也就是说尽量不要多次使用db.auth(),否则有可能出现:too many users are authenticated 错误,遇到这个错误的话,退出重新连接即可。

方法2:连接的时候验证
mongo -u zs -p 654321 --authenticationDatabase yyy

上面的参数解释:

-u: 用户名
-p: 密码
--authenticationDatabase:在哪个数据库中验证(就是用户创建的那个数据库)
# 其它的参数还有,比如:--port

附一:创建管理员

一般情况下,我们用一些普通的用户就可以完成很多操作,但是,很多时候,为了我们可以更方便的管理数据库,我们会创建一个管理账号,比如创建个 root 角色的用户:

use admin;
db.createUser({
		user:"smart",
		pwd: "123456",
		roles:["root"]
});

附二:管理权限的其它操作

查看当前库下的所有用户

use xxx
# 查看当前库的所有用户
show users

修改当前库下的某个用户的信息

# 成功后无返回值
db.updateUser('zs', {pwd: '666666'});

修改当前库下的某个用户的密码

# 成功后无返回值
db.changeUserPassword('zs', '888888');

删除当前库下的某个用户

# 成功后返回true
db.dropUser('zs')

查看系统中的所有用户

# 要在admin库下操作
use admin
db.system.users.find()
发布了22 篇原创文章 · 获赞 0 · 访问量 1154

猜你喜欢

转载自blog.csdn.net/bigpatten/article/details/103941285