我正在使用Grijjy(DelphiMongoDB)的DelphiMongoDB,到目前为止,它的运行情况还不错。但是我找不到任何针对MongoDB进行身份验证的功能。有没有人得到这项工作或想出如何做的? 谢谢和问候
答案 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驱动程序一起使用,您可能需要进行一些更改。
创建根证书颁发机构(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
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。
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服务器的任何工具中使用客户端证书。
您将必须进行一些测试,但我希望它为您指明了正确的方向,以使其正常运行。如果可以的话,将很乐意为开源项目做出贡献。
答案 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)。