如何获取mongodb中用户有权访问的数据库列表?

时间:2015-12-24 08:29:02

标签: java mongodb authentication

是否可以获取Mongodb中特定用户可以访问的数据库列表?

3 个答案:

答案 0 :(得分:0)

您可以通过查找该用户来检查特定用户的访问权限 system.users 集合。他们可以在 db 键上添加投影,该键位于角色键下。

以下是用户集合中的文档结构。

{
  _id: <system defined id>,
  user: "<name>",
  db: "<database>",
  credentials: { <authentication credentials> },
  roles: [
           { role: "<role name>", db: "<database>" },
           ...
         ],
  customData: <custom information>
 }

答案 1 :(得分:0)

在MongoDB shell中,以下命令将列出数据库:

db.adminCommand('listDatabases')

db.getMongo().getDBNames()

对于当前的Java API,请使用 MongoClient listDatabaseNames() 方法,该方法返回包含所有数据库的所有名称的iterable 。作为一个例子(未经测试):

import java.net.UnknownHostException;
import java.util.List;
import java.util.Set;

import com.mongodb.DB;
import com.mongodb.MongoClient;

public class JavaMongoDBConnection {

    public static void main(String[] args) {
        try {

            MongoClient mongoClient = new MongoClient("localhost", 27017);

            MongoIterable<String> allDatabases = mongoClient.listDatabaseNames();

            for (String dbName : allDatabases) {                

                DB db = mongoClient.getDB(dbName);

                char[] password = new char[] {'s', 'e', 'c', 'r', 'e', 't'};
                boolean authenticated = db.authenticate("user", password);

                if (authenticated) {
                    System.out.println("Successfully logged in to MongoDB!");
                    System.out.println("Database: " + dbName);

                    Set<String> collections = db.getCollectionNames();
                    for (String colName : collections) {
                        System.out.println("\t + Collection: " + colName);
                    }

                } else {
                    System.out.println("Invalid username/password");
                }

            }

            mongoClient.close();

        } catch (UnknownHostException ex) {
            ex.printStackTrace();
        }

    }
}

答案 2 :(得分:0)

从4.0.5版MongoDB开始,listDatabases中提供了一个选项,该选项仅允许filter授权的数据库:

  

authorizedDatabases [boolean] [可选]:一个标志,用于确定在启用访问控制后根据用户权限返回哪些数据库。

可能类似于:

return mongoClient.getDatabase("admin").runCommand(
      new BasicDBObject("listDatabases",
            new BasicDBObject("authorizedDatabases", 1)
      )
);

阅读完整的文档,因为版本之间存在一些细微的差异:

  • MongoDB 4.0.5:具有 find 特权
  • 的数据库
  • MongoDB 4.0.6+:具有特权的数据库,即使受限制 特定收藏