Contents
  1. 1. 背景
  • 官方文档
    1. 1. 用户自定义角色
    2. 2. 创建角色语法
  • 创建自定义角色
  • 更新业务库角色权限

  • 背景

    业务上做迁移需要对原有数据进行锁定防止新数据写入,锁定的是db里的一个集合,MongoDB没有MySQL的权限细化管理到表,翻遍MongoDB文档,只能自建角色。

    官方文档

    用户自定义角色

    https://docs.mongodb.com/manual/core/security-user-defined-roles/#user-defined-roles

    创建角色语法

    https://docs.mongodb.com/manual/reference/method/db.createRole/#db.createRole

    创建自定义角色

    在业务库里执行

    use db_name // db_name这里是你业务数据库的名称
    db.createRole(
       {
         role: "my_define_role", // 角色名称
         privileges: [
           { resource: { cluster: true }, actions: [ "addShard" ] }, // 分片集群MongoDB需要填写此项,副本集不用
           { 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: "db_name" }  // db_name这里是你业务数据库的名称
         ]
       },
       { w: "majority" , wtimeout: 5000 } // 副本集默认的写入方式是majority
    )
    

    相关文档
    https://docs.mongodb.com/manual/reference/write-concern/#writeconcern.%22majority%22

    更新业务库角色权限

    db.getSiblingDB("db_name").updateUser( // db_name为业务库名
        "db_name",
        {
            customData: {},
    
            roles: [
            { "role": "my_define_role", "db": "db_name" ,},// my_define_role为自定义角色名
            ],
        }
    

    )

    Contents
    1. 1. 背景
  • 官方文档
    1. 1. 用户自定义角色
    2. 2. 创建角色语法
  • 创建自定义角色
  • 更新业务库角色权限