云数据库MongoDB支持通过DMS(Data Management Service)管理数据库账号,本文介绍如何通过DMS创建和查询数据库账号。

前提条件

  1. 已创建云数据库MongoDB实例。不同类型实例的创建方法如下:
    说明 Serverless实例不支持通过DMS连接,您可以通过Mongo Shell连接并管理数据库账号。如何连接和管理,请参见通过Mongo Shell连接云数据库MongoDB Serverless实例通过Mongo Shell管理数据库账号
  2. 已通过DMS成功连接云数据库MongoDB实例。不同类型实例的连接方法如下:

注意事项

同一数据库的数据库账号不允许重复。

创建数据库账号

说明
  • 数据库账号创建后不支持在云数据库MongoDB控制台的账号管理页面查询。
  • 在哪个数据库创建的数据库账号,该数据库账号就属于哪个数据库。
语法:
db.createUser({user: "user_name", pwd: "password", roles:[{role: "role_name", db: "role_database_name"}]})
参数说明:
参数 描述 示例值
user_name 数据库账号的名称。

若账号名称中包含:/?#[]@特殊字符,需要对特殊字符进行百分比编码。如何编码,请参见百分比编码

test
password 数据库账号的密码。 123456Aa
role_name 授予数据库账号的角色。

角色取值,请参见数据库账号的角色说明

readAnyDatabase
role_database_name 角色所属的数据库名称。

例如,{role: "readAnyDatabase", db: "admin"}表示授予该账号admin数据库的readAnyDatabase角色,对所有数据库具有只读权限。

admin

示例:

在admin数据库中,创建数据库账号test,密码为123456Aa,并授予test账号readAnyDatabase角色。
db.createUser({user: "test", pwd: "123456Aa", roles:[{role: "readAnyDatabase", db: "admin"}]})

返回结果中ok取值为1.0时,表示创建成功,其他取值表示创建失败。

创建成功的返回结果如下:
{
        'ok': 1.0,
        'operationTime': Timestamp(1655286737,1),
        '$clusterTime': {
            'clusterTime': Timestamp(1655286737,1),
            'signature': {
                'hash': BinData(0,"6+urVhsBbHyxgny3S7****"),
                'keyId': NumberLong(710604588397****)
            }
        }
}
说明 参数的更多信息,请参见Response

查询数据库账号

查询云数据库MongoDB实例的所有数据库账号

在admin数据库执行如下命令:
db.getCollection("system.users").find()
说明 该命令可以直接复制执行,无需修改。
返回结果如下:
{
        '_id': "admin.root",
        'userId': BinData(3,"b079b4c8-0e34-4e0d-90f9-7574141****"),
        'user': "root",
        'db': "admin",
        'credentials': {
            'SCRAM-SHA-1': {
                'iterationCount': 10000,
                'salt': "eCUjsUnIqvfLYbY****",
                'storedKey': "W0t/jpngji+Mffy****",
                'serverKey': "sryLTQRiOm9s+EVO1j****"
            },
            'SCRAM-SHA-256': {
                'iterationCount': 15000,
                'salt': "scONYL9TYtM0RNKAhzurFxus2sdr****",
                'storedKey': "0Byz0qQdafMmaEWhiA304zb9MFOT****",
                'serverKey': "1tLLzdk1qmry3zAuVZZZVFZNw0****"
            }
        },
        'roles': [
            {
                'role': "root",
                'db': "admin"
            }
        ]
    },
    {
        '_id': "admin.test",
        'userId': BinData(3,"769ea9a1-6224-470e-8162-19a62f****"),
        'user': "test",
        'db': "admin",
        'credentials': {
            'SCRAM-SHA-1': {
                'iterationCount': 10000,
                'salt': "8fyXsIUgs6aQmafh****",
                'storedKey': "fJQFoKsl7llXdiU/4v****",
                'serverKey': "Tf1zygJ1jti/3/P3UM****"
            },
            'SCRAM-SHA-256': {
                'iterationCount': 15000,
                'salt': "wcWRhs9VXEsmNWtd7ZDQinT****",
                'storedKey': "A5GiHrQE9/tf70hakRY3U3joho3Grt****",
                'serverKey': "ryRAcj6zomYiHJqhA9ObvuYALc3ZZ****"
            }
        },
        'roles': [
            {
                'role': "readAnyDatabase",
                'db': "admin"
            }
        ]
 }

查询目标数据库的所有数据库账号

  • 方式一:在DMS控制台的账号管理页面查询。
    1. DMS控制台左侧的数据库实例列表中,右键单击目标实例。
    2. 在弹出的列表中选择账号管理
    3. 账号管理页面的数据库列表中,选择目标数据库。

      您可以在该页面查询到用户名数据库库权限,并对数据库账号进行编辑删除操作。

  • 方式二:在admin数据库执行查询命令。
    • 语法:
      db.getCollection("system.users").find({db: "database_name"})

      参数说明:database_name为目标数据库的名称。

    • 示例:
      db.getCollection("system.users").find({db: "admin"})
      返回结果如下:
      {
              '_id': "admin.root",
              'userId': BinData(3,"b079b4c8-0e34-4e0d-90f9-7574141****"),
              'user': "root",
              'db': "admin",
              'credentials': {
                  'SCRAM-SHA-1': {
                      'iterationCount': 10000,
                      'salt': "eCUjsUnIqvfLYbY****",
                      'storedKey': "W0t/jpngji+Mffy****",
                      'serverKey': "sryLTQRiOm9s+EVO1j****"
                  },
                  'SCRAM-SHA-256': {
                      'iterationCount': 15000,
                      'salt': "scONYL9TYtM0RNKAhzurFxus2sdr****",
                      'storedKey': "0Byz0qQdafMmaEWhiA304zb9MFOT****",
                      'serverKey': "1tLLzdk1qmry3zAuVZZZVFZNw0****"
                  }
              },
              'roles': [
                  {
                      'role': "root",
                      'db': "admin"
                  }
              ]
          },
          {
              '_id': "admin.test",
              'userId': BinData(3,"769ea9a1-6224-470e-8162-19a62f****"),
              'user': "test",
              'db': "admin",
              'credentials': {
                  'SCRAM-SHA-1': {
                      'iterationCount': 10000,
                      'salt': "8fyXsIUgs6aQmafh****",
                      'storedKey': "fJQFoKsl7llXdiU/4v****",
                      'serverKey': "Tf1zygJ1jti/3/P3UM****"
                  },
                  'SCRAM-SHA-256': {
                      'iterationCount': 15000,
                      'salt': "wcWRhs9VXEsmNWtd7ZDQinT****",
                      'storedKey': "A5GiHrQE9/tf70hakRY3U3joho3Grt****",
                      'serverKey': "ryRAcj6zomYiHJqhA9ObvuYALc3ZZ****"
                  }
              },
              'roles': [
                  {
                      'role': "readAnyDatabase",
                      'db': "admin"
                  }
              ]
       }
  • 方式三:在目标数据库执行查询命令。
    您可以在DMS控制台SQL Console窗口上方的数据库下拉列表中选择目标数据库,执行如下命令:
    show users
    说明 该命令可以直接复制执行,无需修改。
    返回结果如下:
     {
            'users': [
                {
                    '_id': "admin.root",
                    'userId': BinData(3,"b079b4c8-0e34-4e0d-90f9-7574141****"),
                    'user': "root",
                    'db': "admin",
                    'roles': [
                        {
                            'role': "root",
                            'db': "admin"
                        }
                    ],
                    'mechanisms': [
                        "SCRAM-SHA-1",
                        "SCRAM-SHA-256"
                    ]
                },
                {
                    '_id': "admin.test",
                    'userId': BinData(3,"769ea9a1-6224-470e-8162-19a62f****"),
                    'user': "test",
                    'db': "admin",
                    'roles': [
                        {
                            'role': "readAnyDatabase",
                            'db': "admin"
                        }
                    ],
                    'mechanisms': [
                        "SCRAM-SHA-1",
                        "SCRAM-SHA-256"
                    ]
                }
            ],
            'ok': 1.0,
            'operationTime': Timestamp(1655967385,1),
            '$clusterTime': {
                'clusterTime': Timestamp(1655967385,1),
                'signature': {
                    'hash': BinData(0,"f2gL0FuIITTKp+6Ex+25TFt****"),
                    'keyId': NumberLong(710604588397****)
                }
            }
     }

查询目标数据库的单个数据库账号

语法:
db.getCollection("system.users").find({user: "user_name", db: "database_name"})
参数说明:
  • user_name:数据库账号的名称。
  • database_name:数据库账号所属的数据库名称。
在admin数据库执行如下命令:
db.getCollection("system.users").find({user: "test", db: "admin"})
返回结果如下:
{
        '_id': "admin.test",
        'userId': BinData(3,"769ea9a1-6224-470e-8162-19a62f****"),
        'user': "test",
        'db': "admin",
        'credentials': {
            'SCRAM-SHA-1': {
                'iterationCount': 10000,
                'salt': "8fyXsIUgs6aQmafh****",
                'storedKey': "fJQFoKsl7llXdiU/4v****",
                'serverKey': "Tf1zygJ1jti/3/P3UM****"
            },
            'SCRAM-SHA-256': {
                'iterationCount': 15000,
                'salt': "wcWRhs9VXEsmNWtd7ZDQinT****",
                'storedKey': "A5GiHrQE9/tf70hakRY3U3joho3Grt****",
                'serverKey': "ryRAcj6zomYiHJqhA9ObvuYALc3ZZ****"
            }
        },
        'roles': [
            {
                'role': "readAnyDatabase",
                'db': "admin"
            }
        ]
}

数据库账号的角色说明

所属数据库 角色 角色说明
所有数据库 readOnly 对所属数据库的只读权限。
readWrite 对所属数据库的读写权限。
userAdmin 在所属数据库下创建账号和角色的权限。
dbAdmin 在所属数据库下管理数据集合的权限。
dbOwner 包含readWrite、userAdmin和dbAdmin的所有权限。
enableSharding 允许分片集群实例的数据库在多个Shard节点上分布。
admin数据库 readAnyDatabase 对所有数据库的只读权限。
readWriteAnyDatabase 对所有数据库的读写权限。
userAdminAnyDatabase 在所有数据库下创建账号和角色的权限。
dbAdminAnyDatabase 在所有数据库下管理数据集合的权限。
clusterMonitor 执行各种采集信息指令的权限。
hostManager 执行setParameter、killop、resync和killCursors等指令的权限。更多指令信息,请参见hostManager
clusterManager 执行节点管理指令的权限。
clusterAdmin 包含clusterMonitor、hostManager和clusterManager的所有权限。
root 包含admin数据库下的所有权限,包括readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase和dbAdminAnyDatabase等。
说明 角色说明的更多信息,请参见Built-In RolesMongoDB

相关文档