MongoDB 专题
您的位置:database > MongoDB专题 > MongoDB管理用户和角色
MongoDB管理用户和角色
作者:--    发布时间:2019-11-20

本教程提供了mongodb授权模式下的用户和角色管理示例。学习如何向mongodb添加新用户。

创建用户定义的角色

角色授权用户访问mongodb资源。 mongodb提供了许多内置的角色,管理员可以使用它们来控制对mongodb系统的访问。 但是,如果这些角色无法描述所需的权限集,则可以在特定数据库中创建新角色。

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

在管理数据库中创建的角色可以包括适用于管理数据库,其他数据库或群集资源的权限,并且可以从其他数据库中的角色以及管理数据库继承。

要创建新角色,可使用db.createrole()方法,指定permissions数组中的权限和roles数组中的继承角色。

mongodb使用数据库名称和角色名称的组合来唯一定义角色。 每个角色的范围限定在创建角色的数据库中,但mongodb将所有角色信息存储在admin数据库的admin.system.roles集合中。

先决条件

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

  • 对该数据库资源的createrole操作。
  • 对该数据库的grantrole操作指定新角色的权限以及指定要继承的角色。

内置角色 useradminuseradminanydatabase 在其各自的资源上提供 createrolegrantrole 操作。

创建角色来管理当前操作

以下示例创建一个名为 manageoprole 的角色,该角色仅提供运行 db.currentop()db.killop()的权限。

第一步:使用相应的权限连接到mongodb

使用“先决条件”部分指定的权限连接到 mongodmongos

以下过程使用在“启用认证”中创建的用户:myuseradmin

$ mongo --port 27017 -u "myuseradmin" -p "abc123" --authenticationdatabase "admin"

myuseradmin具有在管理员以及其他数据库中创建角色的权限。

第二步:创建一个新角色来管理当前操作

manageoprole具有对多个数据库以及群集资源的权限。 因此,您必须在管理数据库中创建该角色。

use admin
db.createrole(
   {
     role: "manageoprole",
     privileges: [
       { resource: { cluster: true }, actions: [ "killop", "inprog" ] },
       { resource: { db: "", collection: "" }, actions: [ "killcursors" ] }
     ],
     roles: []
   }
)

新角色授予杀死/终止任何操作的权限。

警告: 终止运行操作非常小心。只能使用db.killop()方法或killop命令终止客户端发起的操作,并且不会终止内部数据库操作。

创建角色用来运行 mongostat

以下示例创建一个名为 mongostatrole 的角色,该角色仅提供运行 mongostat 的权限。

第一步:使用相应的权限连接到mongodb

使用“先决条件”部分指定的权限连接到 mongod 或 mongos 。

以下过程使用在启用认证中创建的用户:myuseradmin

$ mongo --port 27017 -u "myuseradmin" -p "abc123" --authenticationdatabase "admin"

myuseradmin具有在管理员以及其他数据库中创建角色的权限。

第二步:创建一个新角色来管理当前的操作

mongostatrole具有作用于群集资源的权限。 因此,您必须在管理数据库中创建该角色。

use admin
db.createrole(
   {
     role: "mongostatrole",
     privileges: [
       { resource: { cluster: true }, actions: [ "serverstatus" ] }
     ],
     roles: []
   }
)

修改现有用户的访问权限

先决条件

  • 必须对数据库具有grantrole操作才能在该数据库上授予角色。
  • 必须在数据库上具有revokerole操作以撤销该数据库上的角色。
  • 要查看角色的信息,必须明确授予该角色,或必须对该角色的数据库具有viewrole操作。

执行步骤

第一步:使用相应的权限连接到mongodb

以具有先决条件部分中指定的权限的用户身份连接到 mongodmongos

以下过程使用在启用认证中创建的用户:myuseradmin

$ mongo --port 27017 -u "myuseradmin" -p "abc123" --authenticationdatabase "admin"

第二步:识别用户的角色和权限

要显示要修改的用户的角色和权限,请使用db.getuser()db.getrole()方法。

例如,要查看在示例中创建的 reportsuser 的角色,执行以下命令:

use reporting
db.getuser("reportsuser")

要显示在 “accounts” 数据库上由 readwrite 角色授予用户的权限,请执行以下操作:

use accounts
db.getrole( "readwrite", { showprivileges: true } )

第三步:确定授予或撤销的权限

如果用户需要额外的权限,则向用户授予具有所需权限集的角色或角色。 如果此类角色不存在,请使用适当的权限集创建新角色。

撤销由现有角色提供的特权子集:撤销原始角色并授予仅包含所需权限的角色。如果角色不存在,您需要创建新角色。

第四步:修改用户的访问权限

4.1. 撤销角色

使用db.revokerolesfromuser()方法撤销角色。以下示例操作从account数据库上删除用户reportsuserreadwrite 角色:

use reporting
db.revokerolesfromuser(
    "reportsuser",
    [
      { role: "readwrite", db: "accounts" }
    ]
)

4.2. 授予角色

使用db.grantrolestouser()方法授予角色。 例如,以下操作授予reportsuser用户account数据库上的读取角色:

use reporting
db.grantrolestouser(
    "reportsuser",
    [
      { role: "read", db: "accounts" }
    ]
)

对于分片集群,用户的更改将在命令运行的 mongos 上即时生效。但是,对于群集中的其他mongos 实例,用户缓存可能会等待10分钟才能刷新。请参阅usercacheinvalidationintervalsecs

修改现有用户的密码

先决条件

要修改数据库上另一个用户的密码,您必须对该数据库具有changeanypassword操作。

操作步骤:

第一步:使用相应的权限连接到mongodb

以具有先决条件部分中指定的权限的用户身份连接到 mongodmongos

以下过程使用在启用认证中创建的用户:myuseradmin

$ mongo --port 27017 -u "myuseradmin" -p "abc123" --authenticationdatabase "admin"

第二步:更改密码

将用户的用户名和新密码传递给db.changeuserpassword()方法。

以下操作将reporting用户的密码更改为:soh3tbyhxuliw8ypjpxmt1oofl

db.changeuserpassword("reporting", "soh3tbyhxuliw8ypjpxmt1oofl")

查看用户的角色

先决条件

要查看其他用户的信息,您必须对其他用户的数据库具有viewuser操作。

用户可以查看自己的信息。

第一步:使用相应的权限连接到mongodb

以具有先决条件部分中指定的权限的用户身份连接到 mongodmongos

以下过程使用在启用认证中创建的用户:myuseradmin

$ mongo --port 27017 -u "myuseradmin" -p "abc123" --authenticationdatabase "admin"

第二步:查看用户的角色

使用usersinfo命令或db.getuser()方法显示用户信息。

例如,要查看在示例中创建的 reportsuser 的角色,请发出:

use reporting
db.getuser("reportsuser")

在返回的文档中,roles字段显示reportsuser的所有角色:

...
"roles" : [
   { "role" : "readwrite", "db" : "accounts" },
   { "role" : "read", "db" : "reporting" },
   { "role" : "read", "db" : "products" },
   { "role" : "read", "db" : "sales" }
]

查看角色的权限

先决条件

要查看角色的信息,您必须明确授予该角色,或必须对该角色的数据库具有 viewrole 操作。

第一步:使用相应的权限连接到mongodb

以具有先决条件部分中指定的权限的用户身份连接到 mongodmongos

以下过程使用在启用认证中创建的用户:myuseradmin

$ mongo --port 27017 -u "myuseradmin" -p "abc123" --authenticationdatabase "admin"

第二步:查看角色授予的权限

对于给定的角色,请使用db.getrole()方法或rolesinfo命令与showprivileges选项一起执行:

例如,要查看在product数据库上由读取角色授予的权限,请使用以下操作,问题如下:

use products
db.getrole( "read", { showprivileges: true } )

在返回的文档中,有两个数组:privilegesinheritedprivileges。权限列出了角色指定的权限,并排除了从其他角色继承的权限。 inheritedprivileges列出了由此角色授予的所有权限,这两个角色都是直接指定的并被继承。 如果该角色不能从其他角色继承,则两个字段是相同的。

...
"privileges" : [
  {
    "resource": { "db" : "products", "collection" : "" },
    "actions": [ "collstats","dbhash","dbstats","find","killcursors","plancacheread" ]
  },
  {
    "resource" : { "db" : "products", "collection" : "system.js" },
    "actions": [ "collstats","dbhash","dbstats","find","killcursors","plancacheread" ]
  }
],
"inheritedprivileges" : [
  {
    "resource": { "db" : "products", "collection" : "" },
    "actions": [ "collstats","dbhash","dbstats","find","killcursors","plancacheread" ]
  },
  {
    "resource" : { "db" : "products", "collection" : "system.js" },
    "actions": [ "collstats","dbhash","dbstats","find","killcursors","plancacheread" ]
  }
]

网站声明:
本站部分内容来自网络,如您发现本站内容
侵害到您的利益,请联系本站管理员处理。
联系站长
373515719@qq.com
关于本站:
编程参考手册