使用Grijjy的DelphiMongoDB对MongoDB进行身份验证

时间:2019-02-26 18:22:53

标签: mongodb delphi

我正在使用Grijjy(DelphiMongoDB)的DelphiMongoDB,到目前为止,它的运行情况还不错。但是我找不到任何针对MongoDB进行身份验证的功能。有没有人得到这项工作或想出如何做的? 谢谢和问候

2 个答案:

答案 0 :(得分:4)

更新:Grijjy驱动程序的最新版本现在支持TLS,X.509客户端证书身份验证,SCRAM SHA-1和SHA-256身份验证。我们还在Azure上针对MongoDB Atlas实例进行了测试。

这是有关如何使用身份验证的简单示例。

var
  Settings: TgoMongoClientSettings;
  Client: IgoMongoClient;
  Database: IgoMongoDatabase;
  Collection: IgoMongoCollection;
  Doc: TgoBsonDocument;

begin
  Settings := TgoMongoClientSettings.Create;
  Settings.Secure := True;
  Settings.AuthMechanism := TgoMongoAuthMechanism.SCRAM_SHA_1;
  Settings.AuthDatabase := 'admin';
  Settings.Username := 'username';
  Settings.Password := 'password';
  //Settings.QueryFlags := [TgoMongoQueryFlag.SlaveOk];
  Client := TgoMongoClient.Create('my.mongodb.server.com', 27017, Settings);
  Database := Client.GetDatabase('mydatabase');
  Collection := Database.GetCollection('mycollection');

  for Doc in Collection.Find() do
    Writeln(Doc.ToJson(TgoJsonWriterSettings.Pretty));
end;

旧版:是的,已发布的Grijjy驱动程序不支持身份验证,但是我们已在内部对其进行了测试,并且可能会在不久的将来向Github添加此功能。如果您想进行以下更改,也欢迎提出请求请求:

MongoDB当前支持两种身份验证类型:SCRAM和x.509证书身份验证。在内部,我们已经测试了x.509证书身份验证,但是Github上的当前驱动程序没有反映此功能。我们还没有尝试过SCRAM。

要使其与我们在Github上发布的MongoDB驱动程序一起使用,您可能需要进行一些更改。

  1. 您需要为MongoDB服务器创建一个自签名的CA和证书。
  2. 您需要将MongoDB服务器配置为使用证书。
  3. 您需要为一个或多个MongoDB客户端创建一个自签名证书。您可以对所有客户端使用相同的证书。
  4. 您需要启用SSL / TLS连接,并将客户端证书与MongoDB驱动程序配合使用。

1要创建所有证书,您需要一个现有的CA或创建一个自签名的CA。您可以使用openssl.exe二进制文件执行大多数操作:

创建根证书颁发机构(ca.pem和privkey.pem):

openssl req -out ca.pem -new -x509 -days 3650 -subj "/C=US/ST=California/O=Company/CN=root/emailAddress=root@domain.com"

要为您的MongoDB服务器(server.pem)创建自签名证书,请执行以下操作:

openssl genrsa -out server.key 2048
openssl req -key server.key -new -out server.req -subj "/C=US/ST=California/O=Company/CN=db.myserver.com/emailAddress=user@domain.com"
openssl x509 -req -in server.req -CA ca.pem -CAkey privkey.pem -CAcreateserial -out server.crt -days 3650
type server.key server.crt > server.pem
openssl verify -CAfile ca.pem server.pem

2要将MongoDB配置为在Windows版本(与其他版本类似)上使用证书,请编辑c:\ data \ mongod.cfg:

  systemLog:
      destination: file
      path: c:\data\log\mongod.log
  storage:
      dbPath: c:\data\db
  net:
      port: 27017
      bindIp: 127.0.0.1
      ssl:
        mode: requireSSL
        PEMKeyFile: c:\data\server.pem
        CAFile: c:\data\ca.pem
        {allowConnectionsWithoutCertificates: true }
        {allowInvalidHostnames: true }

如果您使用的是自签名证书,则可能需要将allowInvalidHostnames设置为True。

3为您的MongoDB客户端(client1.pem)创建一个自签名证书:

openssl genrsa -out client1.key 2048
openssl req -key client1.key -new -out client1.req -subj "/C=US/ST=California/O=Company/CN=client1/emailAddress=user@domain.com"
openssl x509 -req -in client1.req -CA ca.pem -CAkey privkey.pem -CAserial ca.srl -out client1.crt -days 3650
type client1.key client1.crt > client1.pem
openssl verify -CAfile ca.pem client1.pem

注意:您还需要在用于管理MongoDB服务器的任何工具中使用客户端证书。

4要为MongoDB驱动程序启用SSL / TLS连接,您可能必须更改源文件。我们的单元Grijjy.Http显示了如何为“ https”启用驱动程序。本质上,您需要在方法TgoMongoProtocol.Connect内的Grijjy.MongoDB.Protocol单元可能中对Connection做两件事:

  1. 设置Connection.SSL:= True;
  2. 将Connection.Certificate设置为您创建的client1.pem。

您将必须进行一些测试,但我希望它为您指明了正确的方向,以使其正常运行。如果可以的话,将很乐意为开源项目做出贡献。

答案 1 :(得分:3)

据我所知,https://github.com/grijjy/DelphiMongoDB/不支持身份验证。

从源头上来看,https://github.com/stijnsanders/TMongoWire也不是。

FireDAC Mongo使用C Mongo客户端库,该库支持身份验证。

我们的开源SynMongoDB.pas支持身份验证,FPC和几乎所有的Delphi版本(甚至是Unicode之前的版本)。使用变体后期绑定来访问BSON / JSON内容,使用它非常容易。只需检查the corresponding documentation pages。您可以编写例如:

var doc: variant;
...
  doc := Coll.FindOne(5);
  writeln('Name: ',doc.Name);
  writeln('Number: ',doc.Number);

var docs: TVariantDynArray;
...
  Coll.FindDocs(docs);
  for i := 0 to high(docs) do
    writeln('Name: ',docs[i].Name,'  Number: ',docs[i].Number);

TMongoClient.OpenAuth方法同时支持旧的/不推荐使用的MONGODB-CR方法和新的SCRAM-SHA-1方法:

Client := TMongoClient.Create('localhost',27017);
  try
    DB := Client.OpenAuth('mydb','mongouser','mongopwd');
    ...

请注意,即使它是 mORMot 框架的一部分,该单元也是独立的:您无需使用框架的ORM,SOA或MVC部分-即使它与ORM配合得很好,并且是able to convert SQL-like statements into MongoDB pipelines,这是一个非常强大的独特功能。另一个独特的功能是Decimal128的正确支持。

在网络上,还请确保使用与服务器的TLS连接。 SynMongoDB.pas可以在Windows下做到这一点,而无需外部OpenSSL库(它使用原始Windows SO API)。