通过Mongo Shell管理数据库账号

Mongo ShellMongoDB自带的数据库管理工具。云数据库MongoDB支持通过Mongo Shell管理数据库账号。本文介绍如何通过Mongo Shell创建和查询数据库账号。

前提条件

  1. 已创建云数据库MongoDB实例。不同类型实例的创建方法如下:

    说明

    云数据库MongoDB已停止新购Serverless实例,您可以使用现存实例。

  2. 已通过Mongo Shell成功连接云数据库MongoDB实例。不同类型实例的连接方法如下:

注意事项

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

创建数据库账号

说明
  • 数据库账号创建后不支持在云数据库MongoDB控制台的账号管理页面查询。

  • 首次通过Mongo Shell创建数据库账号时,需要在admin数据库下对实例固有的root账号进行认证。

  1. 切换到admin数据库。

    use admin
    说明

    该命令可以直接复制执行,无需修改。

  2. 认证root账号。

    语法:

    db.auth("root","password")

    参数说明:passwordroot账号的密码。

    示例:

    db.auth("root","123456Aa")
  3. 创建数据库账号。

    • 方式一:切换到目标数据库,创建数据库账号。

      在哪个数据库创建的数据库账号,该数据库账号就属于哪个数据库。您可以通过use database_name命令切换数据库,其中database_name为目标数据库的名称。

      语法:

      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"}]})

      创建成功的返回结果如下:

      Successfully added user: {
              "user" : "test",
              "roles" : [
                      {
                              "role" : "readAnyDatabase",
                              "db" : "admin"
                      }
              ]
      }
    • 方式二:无需切换数据库,创建数据库账号。

      您可以使用以下任意一种命令创建数据库账号。

      • 命令一:

        语法:

        db.getMongo().getDB("database_name").createUser({user: "user_name", pwd: "password", roles: [{role: "role_name", db: "role_database_name"}]})

        参数说明:

        参数

        描述

        示例值

        database_name

        数据库账号所属的数据库名称。

        admin

        user_name

        数据库账号的名称。

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

        test

        password

        数据库账号的密码。

        123456Aa

        role_name

        授予数据库账号的角色。

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

        readAnyDatabase

        role_database_name

        角色所属的数据库名称。

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

        admin

        示例:

        创建属于admin数据库的数据库账号test,密码为123456Aa,并授予test账号readAnyDatabase角色。

        db.getMongo().getDB("admin").createUser({user: "test", pwd: "123456Aa", roles: [{role: "readAnyDatabase", db: "admin"}]})

        创建成功的返回结果如下:

        Successfully added user: {
                "user" : "test",
                "roles" : [
                        {
                                "role" : "readAnyDatabase",
                                "db" : "admin"
                        }
                ]
        }
      • 命令二:

        语法:

        db.getSiblingDB("database_name").createUser({user: "user_name", pwd: "password", roles: [{role: "role_name", db: "role_database_name"}]})

        参数说明:

        参数

        描述

        示例值

        database_name

        数据库账号所属的数据库名称。

        admin

        user_name

        数据库账号的名称。

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

        test

        password

        数据库账号的密码。

        123456Aa

        role_name

        授予数据库账号的角色。

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

        readAnyDatabase

        role_database_name

        角色所属的数据库名称。

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

        admin

        示例:

        创建属于admin数据库的数据库账号test,密码为123456Aa,并授予test账号readAnyDatabase角色。

        db.getSiblingDB("admin").createUser({user: "test", pwd: "123456Aa", roles: [{role: "readAnyDatabase", db: "admin"}]})

        创建成功的返回结果如下:

        Successfully added user: {
                "user" : "test",
                "roles" : [
                        {
                                "role" : "readAnyDatabase",
                                "db" : "admin"
                        }
                ]
        }

查询数据库账号

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

admin数据库执行如下命令:

db.getCollection("system.users").find()
说明

该命令可以直接复制执行,无需修改。

返回结果如下:

{ "_id" : "admin.root", "userId" : UUID("b079b4c8-0e34-4e0d-90f9-75741414****"), "user" : "root", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "WeN7mJumlZKG2dvzLRDL*****", "storedKey" : "wfRUnCq55ajFwnYxf9MQJ0k****", "serverKey" : "tP70xGJ9PRZs01VSJF1YDrHg****" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, "salt" : "5aIQ734c2Whg2pPwfg****/mpJulsd+33rE****", "storedKey" : "otMBwA2TTwoU****+dfwccnfPN14Dy5Oq6keYOl****", "serverKey" : "VCE****+aLkXGzCqRiaPfjnFG4WFiAOq0BKXxTo0****" } }, "roles" : [ { "role" : "root", "db" : "admin" } ] }
{ "_id" : "admin.test", "userId" : UUID("769ea9a1-6224-470e-8162-19a62fa2****"), "user" : "test", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "8fyXsIUgs6aQmafhTDrS****", "storedKey" : "fJQFoKsl7ll****/4vFU4xQn****", "serverKey" : "Tf1zygJ****/3/P3UMM47rr8****" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, "salt" : "wcWRhs9VXEsmNWtd7ZD****+NbYXx8ugJ3p2****", "storedKey" : "A5GiH****/tf70hakRY3U3joho3GrtFWQ****/WX****", "serverKey" : "ryRAcj6zomYiHJqhA9ObvuYALc3ZZva8ImR7B89C****" } }, "roles" : [ { "role" : "readAnyDatabase", "db" : "admin" } ] }

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

说明

您可以通过use database_name命令切换数据库,其中database_name为目标数据库的名称。

  • 方式一:在目标数据库执行查询命令。

    show users
    说明

    该命令可以直接复制执行,无需修改。

    返回结果如下:

    {
            "_id" : "admin.root",
            "userId" : UUID("b079b4c8-0e34-4e0d-90f9-75741414****"),
            "user" : "root",
            "db" : "admin",
            "roles" : [
                    {
                            "role" : "root",
                            "db" : "admin"
                    }
            ],
            "mechanisms" : [
                    "SCRAM-SHA-1",
                    "SCRAM-SHA-256"
            ]
    }
    {
            "_id" : "admin.test",
            "userId" : UUID("769ea9a1-6224-470e-8162-19a62fa2****"),
            "user" : "test",
            "db" : "admin",
            "roles" : [
                    {
                            "role" : "readAnyDatabase",
                            "db" : "admin"
                    }
            ],
            "mechanisms" : [
                    "SCRAM-SHA-1",
                    "SCRAM-SHA-256"
            ]
    }
  • 方式二:在admin数据库执行查询命令。

    语法:

    db.getCollection("system.users").find({db: "database_name"})

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

    示例:

    db.getCollection("system.users").find({db: "admin"})

    返回结果如下:

    { "_id" : "admin.root", "userId" : UUID("b079b4c8-0e34-4e0d-90f9-75741414****"), "user" : "root", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "WeN7mJumlZKG2dvzLRDL*****", "storedKey" : "wfRUnCq55ajFwnYxf9MQJ0k****", "serverKey" : "tP70xGJ9PRZs01VSJF1YDrHg****" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, "salt" : "5aIQ734c2Whg2pPwfg****/mpJulsd+33rE****", "storedKey" : "otMBwA2TTwoU****+dfwccnfPN14Dy5Oq6keYOl****", "serverKey" : "VCE****+aLkXGzCqRiaPfjnFG4WFiAOq0BKXxTo0****" } }, "roles" : [ { "role" : "root", "db" : "admin" } ] }
    { "_id" : "admin.test", "userId" : UUID("769ea9a1-6224-470e-8162-19a62fa2****"), "user" : "test", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "8fyXsIUgs6aQmafhTDrS****", "storedKey" : "fJQFoKsl7ll****/4vFU4xQn****", "serverKey" : "Tf1zygJ****/3/P3UMM47rr8****" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, "salt" : "wcWRhs9VXEsmNWtd7ZD****+NbYXx8ugJ3p2****", "storedKey" : "A5GiH****/tf70hakRY3U3joho3GrtFWQ****/WX****", "serverKey" : "ryRAcj6zomYiHJqhA9ObvuYALc3ZZva8ImR7B89C****" } }, "roles" : [ { "role" : "readAnyDatabase", "db" : "admin" } ] }

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

说明

查询单个数据库账号的命令需在admin数据库执行。

语法:

db.getCollection("system.users").find({user: "user_name", db: "database_name"})

参数说明:

  • user_name:数据库账号的名称。

  • database_name:数据库账号所属的数据库名称。

示例:

db.getCollection("system.users").find({user: "test", db: "admin"})

返回结果如下:

{ "_id" : "admin.test", "userId" : UUID("769ea9a1-6224-470e-8162-19a62fa2****"), "user" : "test", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "8fyXsIUgs6aQmafhTDrS****", "storedKey" : "fJQFoKsl7llXdiU/4vFU4xQn****", "serverKey" : "Tf1zygJ****/3/P3UMM47rr8****" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, "salt" : "wcWRhs9VXEsmNWtd7ZD****+NbYXx8ugJ3p2****", "storedKey" : "A5GiH****/tf70hakRY3U3joho3GrtFWQ****/WX****", "serverKey" : "ryRAcj6zomYiHJqhA9ObvuYALc3ZZva8ImR7B89C****" } }, "roles" : [ { "role" : "root", "db" : "admin" } ] }

数据库账号的角色说明

所属数据库

角色

角色说明

所有数据库

readOnly

对所属数据库的只读权限。

readWrite

对所属数据库的读写权限。

userAdmin

在所属数据库下创建账号和角色的权限。

dbAdmin

在所属数据库下管理数据集合的权限。

dbOwner

包含readWrite、userAdmindbAdmin的所有权限。

enableSharding

允许分片集群实例的数据库在多个Shard节点上分布。

admin数据库

readAnyDatabase

对所有数据库的只读权限。

readWriteAnyDatabase

对所有数据库的读写权限。

userAdminAnyDatabase

在所有数据库下创建账号和角色的权限。

dbAdminAnyDatabase

在所有数据库下管理数据集合的权限。

clusterMonitor

执行各种采集信息指令的权限。

hostManager

执行setParameter、killop、resynckillCursors等指令的权限。

clusterManager

执行节点管理指令的权限。

clusterAdmin

包含clusterMonitor、hostManagerclusterManager的所有权限。

root

包含admin数据库下的所有权限,包括readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabasedbAdminAnyDatabase等。

说明

角色说明的更多信息,请参见Built-In Roles

相关文档