mongodb 库数量限制_mongodb权限管理一点心得

mongodb基于角色的权限模型(Role-Based Access Control)

我们直接用mongodb里的数据模型来说明

用户模型

user
{
  roles: [
    {
      role: '<role>', // 内建 或者 用户定义 角色
      db: '<database>' // 从其他数据库中指定角色
    } | "<role>" // 文档 或者 字符串,字符串 <role> 表示从当前数据库中找角色
  ]
}

example:
{
  roles: [ { role: "readWrite", db: "admin" }, "readWrite" ]
}

以上例子表示用户拥有来自 admin 的「readWrite」角色,和来自自身库的「readWrite」角色,注意权限是由 role 定义的,这两个角色的权限是不一致的

「readWrite」是一个数据库的「内建角色」 关于「内建角色」 https://docs.mongodb.com/manual/reference/built-in-roles/

可以通过命令 rolesInfo 查询到内建角色的权限

db.runCommand({
    rolesInfo: 1,
    showPrivileges:true,
    showBuiltinRoles: true
})

角色模型

role
{
  privileges: [
    {
      resource: {
        db: '<database>',
        collection: '<collection>'
      },
      actions: ["<action>", ... ] // 权限列表 https://docs.mongodb.com/manual/reference/privilege-actions/
    }
  ],
  roles: [{ role: "<role>", db: "<database>" } | "<role>"] // 指定权限继承的角色
}

关于resource的简单说明: db + collection 指定某个db的某个集合,如果值为 “”(空字符串) 表示「除系统外任何」 例如: { db: "products", collection: "inventory" } 指定 products 库的 inventory集合 { db: "", collection: "inventory" } 任何数据库的 inventory 集合 { db: "products", collection: "" } products 数据库的任何集合 { db: "", collection: "" } 任何数据库的任何集合

resource文档 https://docs.mongodb.com/manual/reference/resource-document/#resource-document

以上任何都不包括「系统集合」 关于「系统集合」 https://docs.mongodb.com/manual/reference/system-collections/

我们拿上面的「readWrite」角色举例,我们在运行 rolesInfo 命令之后(非admin库),大致能看到以下结果:

example:
 {
    "db" : "foodb", // 这个角色所属的数据库
    "inheritedPrivileges" : [
        ...
    ],
    "inheritedRoles" : [ ],
    "isBuiltin" : true,
    "privileges" : [
        {
            "actions" : [
                "changeStream",
                ...
            ], // 权限列表
            "resource" : {
                "collection" : "", // 表示对所有的集合有以上权限
                "db" : "foodb" // 表示作用于foodb
            }
        },
        {
            "actions" : [
                "changeStream",
         ...
            ],
            "resource" : {
                "collection" : "system.js", // 系统集合
                "db" : "foodb"
            }
        }
    ],
    "role" : "readWrite", // 角色名
    "roles" : [ ]
 }

以上例子有部分省略,表达的是对于foodb有读写权限。 在admin库运行命令会有不同结果,大家不妨自己尝试一下。

实际使用

根据使用场景,首先定义出一个满足应用crud的角色 roleCommands文档 https://docs.mongodb.com/manual/reference/command/nav-role-management/

use admin
db.createRole(
   {
     role: "testRole",
     privileges: [
       { resource: { db: "ding-group-task-service", collection: "" }, actions: ["find", "insert", "remove", "update"] },
     ],
     roles: []
   }
)

其中 find 是一系列查询命令的集合,这4个actions可以满足大部分应用的crud需求。 权限列表文档 https://docs.mongodb.com/manual/reference/privilege-actions/

接下来把这个角色赋予用户 userCommands文档 https://docs.mongodb.com/manual/reference/command/nav-user-management/

db.createUser({
    user: 'test',
    pwd: '123456',
    roles: ["testRole"]
})

然后你可以通过这个用户 mongodb://test:123456@XXXX 登录,进行测试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MongoDB是一种基于文档的数据库,使用BSON(二进制JSON)格式来存储和查询数据。它是开源的,使用C++编写,但也提供了Java驱动程序,使Java开发人员可以方便地与MongoDB进行交互。 Java驱动程序是MongoDB的官方驱动程序之一,它提供了一组API,使Java开发人员可以轻松地连接和操作MongoDB。在这篇文章中,我们将深入探讨Java驱动程序如何连接MongoDB,以及Java驱动程序的源代码如何实现这些功能。 首先,我们需要在Java应用程序中引入MongoDB的Java驱动程序。可以在pom.xml文件中添加以下依赖项: ```xml <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>3.12.7</version> </dependency> ``` 接下来,我们需要创建一个MongoClient对象来连接MongoDB。MongoClient对象是Java驱动程序中用于连接MongoDB的核心类之一。以下是创建MongoClient对象的示例代码: ```java import com.mongodb.MongoClient; import com.mongodb.MongoClientURI; public class MongoDBConnection { public static void main(String[] args) { MongoClientURI uri = new MongoClientURI("mongodb://localhost:27017"); MongoClient mongoClient = new MongoClient(uri); } } ``` 在这个例子中,我们使用MongoClientURI类来指定MongoDB的连接字符串。连接字符串包含MongoDB的主机名和端口号。然后,我们使用MongoClient类创建一个连接MongoDB的客户端对象。现在,我们已经成功地连接到MongoDB,接下来我们可以使用Java驱动程序来操作MongoDB中的数据了。 Java驱动程序提供了一组API,使Java开发人员可以与MongoDB进行交互。以下是一些常用的API: - MongoDatabase:表示MongoDB中的数据库。 - MongoCollection:表示MongoDB中的集合。 - Document:表示MongoDB中的文档。 以下是使用Java驱动程序查询MongoDB中数据的示例代码: ```java import com.mongodb.MongoClient; import com.mongodb.MongoClientURI; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoCursor; import com.mongodb.client.MongoDatabase; import org.bson.Document; public class MongoDBQuery { public static void main(String[] args) { MongoClientURI uri = new MongoClientURI("mongodb://localhost:27017"); MongoClient mongoClient = new MongoClient(uri); MongoDatabase database = mongoClient.getDatabase("test"); MongoCollection<Document> collection = database.getCollection("users"); MongoCursor<Document> cursor = collection.find().iterator(); while (cursor.hasNext()) { Document doc = cursor.next(); System.out.println(doc.toJson()); } cursor.close(); mongoClient.close(); } } ``` 在这个例子中,我们使用MongoDatabase和MongoCollection类来获取MongoDB中的数据库和集合。然后,我们使用MongoCollection类中的find()方法来查询集合中的所有文档。最后,我们使用MongoCursor类来遍历查询结果,并使用Document类来表示MongoDB中的文档。 这就是Java驱动程序连接MongoDB的基本原理。Java驱动程序提供了一组简单易用的API,使Java开发人员可以轻松地与MongoDB进行交互。如果您想深入了解Java驱动程序的工作原理,可以查看Java驱动程序的源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值