db.createRole()

在本页面

Definition

  • db. createRole(* role writeConcern *)
    • 在数据库中创建一个角色。您可以通过显式列出特权或让角色从其他角色继承特权或同时从这两个角色中为角色指定特权。该角色适用于在其上运行方法的数据库。

db.createRole()方法接受以下参数:

ParameterTypeDescription
roledocument包含角色名称和角色定义的文档。
writeConcerndocument可选的。应用于此操作的write concern级别。 writeConcern文档使用与getLastError命令相同的字段。

role文档的格式如下:

{
  role: "<name>",
  privileges: [
     { resource: { <resource> }, actions: [ "<action>", ... ] },
     ...
  ],
  roles: [
     { role: "<role>", db: "<database>" } | "<role>",
      ...
  ],
  authenticationRestrictions: [
    {
      clientSource: ["<IP>" | "<CIDR range>", ...],
      serverAddress: ["<IP>" | "<CIDR range>", ...]
    },
    ...
  ]
}

role文档具有以下字段:

FieldTypeDescription
rolestring新角色的名称。
privilegesarray授予角色的特权。特权由资源和允许的操作组成。有关特权的语法,请参见privileges数组。


您必须包含privileges字段。使用空数组指定* no 特权。
| roles | array |一个角色数组,此角色从中继承特权。
您必须包含roles字段。使用空数组指定要继承的
no *角色。
| authenticationRestrictions | array |可选。
服务器对角色强制执行的身份验证限制。指定允许授予此角色的用户连接和/或可以从其连接的 IP 地址和 CIDR 范围的列表。
3.6 版中的新功能。

db.createRole()方法包装createRole命令。

Roles

roles字段中,您可以同时指定built-in rolesuser-defined roles

要指定运行db.createRole()的同一数据库中存在的角色,可以使用该角色的名称指定该角色:

"readWrite"

或者,您可以通过文档指定角色,如:

{ role: "<role>", db: "<database>" }

要指定存在于其他数据库中的角色,请与文档一起指定该角色。

Authentication Restrictions

3.6 版的新功能。

authenticationRestrictions文档可以仅包含以下字段。如果authenticationRestrictions文档包含无法识别的字段,服务器将引发错误:

Field NameValueDescription
clientSourceIP 地址和/或 CIDR 范围的数组如果存在,则在验证用户身份时,服务器将验证 Client 端的 IP 地址在给定列表中或属于列表中的 CIDR 范围。如果 Client 端的 IP 地址不存在,则服务器不会对用户进行身份验证。
serverAddressIP 地址和/或 CIDR 范围的数组Client 端可以连接的 IP 地址或 CIDR 范围的列表。如果存在,服务器将通过给定列表中的 IP 地址验证是否接受了 Client 端的连接。如果通过无法识别的 IP 地址接受了连接,则服务器不会对用户进行身份验证。

Important

如果用户继承具有不兼容身份验证限制的多个角色,则该用户将变得无法使用。

例如,如果用户继承一个角色,其中clientSource字段是["198.51.100.0"],而另一个角色则继承clientSource字段是["203.0.113.0"],则服务器将无法对该用户进行身份验证。

有关 MongoDB 中身份验证的更多信息,请参阅Authentication

Behavior

Replica set

如果在副本集上运行,默认情况下将使用majority写关注来执行db.createRole()

Scope

除在admin数据库中创建的角色外,角色只能包含适用于其数据库的特权,并且只能从其数据库中的其他角色继承。

admin数据库中创建的角色可以包括应用于admin数据库,其他数据库或cluster资源的特权,并且可以从其他数据库以及admin数据库中的角色继承。

如果该角色已存在于数据库中,则db.createRole()方法将返回重复角色错误。

Required Access

要在数据库中创建角色,您必须具有:

内置角色userAdminuserAdminAnyDatabase在其各自的resources上提供createRolegrantRole动作。

要创建指定了authenticationRestrictions的角色,必须在创建该角色的database resource上具有setAuthenticationRestriction action

Example

以下db.createRole()方法在admin数据库上创建myClusterwideAdmin角色:

use admin
db.createRole(
   {
     role: "myClusterwideAdmin",
     privileges: [
       { resource: { cluster: true }, actions: [ "addShard" ] },
       { resource: { db: "config", collection: "" }, actions: [ "find", "update", "insert", "remove" ] },
       { resource: { db: "users", collection: "usersCollection" }, actions: [ "update", "insert", "remove" ] },
       { resource: { db: "", collection: "" }, actions: [ "find" ] }
     ],
     roles: [
       { role: "read", db: "admin" }
     ]
   },
   { w: "majority" , wtimeout: 5000 }
)