高级连接信息
连接协议和安全性
驱动程序和服务器之间的通信由 Bolt 协议进行。服务器 URI 的方案决定了连接是否加密,以及如果加密,接受哪种类型的证书。
URL 方案 | 加密 | 备注 |
---|---|---|
neo4j |
本地设置的默认值 |
|
neo4j+s |
(仅限 CA 签名的证书) |
Aura 的默认值 |
neo4j+ssc |
(CA 签名和自签名证书) |
无论实例是真正的集群环境还是单机环境,驱动程序在成功连接后都会从服务器接收一个 *路由表*。驱动程序的路由行为与 Neo4j 的集群 协同工作,将读/写事务定向到适当的集群成员。如果您想定位 *特定的* 机器,请改用 bolt 、bolt+s 或 bolt+ssc URI 方案。 |
要使用的连接方案并非您自己选择,而是由服务器要求决定。您必须提前知道正确的服务器方案,因为在连接之前不会暴露任何元数据。如果您不确定,请咨询数据库管理员。
身份验证方法
基本身份验证
基本身份验证方案依赖于传统的用户名和密码。这些可以是您本地安装的凭据,也可以是 Aura 实例提供的凭据。
driver, err := neo4j.NewDriverWithContext(
dbUri,
neo4j.BasicAuth(dbUser, dbPassword, ""))
基本身份验证方案也可用于针对 LDAP 服务器进行身份验证(仅限企业版)。
Kerberos 身份验证
Kerberos 身份验证方案需要 base64 编码的票据。只有在服务器安装了 Kerberos 插件 的情况下才能使用它。
driver, err := neo4j.NewDriverWithContext(dbUri, neo4j.KerberosAuth(ticket))
承载身份验证
承载身份验证方案需要由身份提供商通过 Neo4j 的 单点登录功能 提供 base64 编码的令牌。
driver, err := neo4j.NewDriverWithContext(dbUri, neo4j.BearerAuth(token))
承载身份验证方案需要在 服务器上配置单点登录。配置完成后,客户端可以通过 Discovery API 发现 Neo4j 的配置。 |
自定义身份验证
使用函数 CustomAuth
登录具有自定义身份验证方案的服务器。
轮换身份验证令牌
可以轮换预期会过期的身份验证令牌(例如 SSO)。在实例化 Driver
时,您需要提供一个 TokenManager
实例,而不是静态身份验证令牌。
最简单的入门方法是使用内置实现之一:BasicTokenManager
和 BearerTokenManager
。
fetchAuthTokenFromProvider := func(ctx context.Context) (neo4j.AuthToken, *time.Time, error) {
// some way of getting a token
token, err := getSsoToken(ctx)
if err != nil {
return neo4j.AuthToken{}, nil, err
}
// assume we know tokens expire every 60 seconds
expiresIn := time.Now().Add(60 * time.Second)
// include a little buffer so that we fetch a new token before the old one expires
expiresIn = expiresIn.Add(-10 * time.Second)
// or return nil instead of `&expiresIn` if we don't expect it to expire
return token, &expiresIn, nil
}
// create a new driver with a bearer token manager
_, _ = neo4j.NewDriverWithContext(dbUri, auth.BearerTokenManager(fetchAuthTokenFromProvider))
TokenManager 实现和提供程序不得以任何方式与驱动程序交互,因为这可能导致死锁和未定义行为。 |
相互 TLS (mTLS)(客户端证书作为双因素认证)
相互 TLS (mTLS) 允许您使用客户端证书作为与服务器进行身份验证的第二个因素。该证书只能与身份验证令牌一起使用,并且不能替代常规身份验证,除非在服务器上禁用了身份验证。
客户端的证书和公钥必须放置在服务器的 <NEO4J_HOME>/certificates/bolt/trusted
目录中。有关服务器设置的更多信息,请参阅 配置 Bolt 上的 SSL。
为了使 mTLS 工作,驱动程序与服务器的连接必须加密,即连接 URI 方案必须是 +s 或 +ssc (例如 neo4j+s://example.com:7687 )。 |
对于静态证书,请使用 auth.NewStaticClientCertificateProvider()
。
该方法需要一个 ClientCertificate
实例。
certProvider, err := auth.NewStaticClientCertificateProvider(auth.ClientCertificate {
CertFile: "path/to/cert.pem",
KeyFile: "path/to/key.pem",
Password: "theCertPassword",
})
if err != nil {
log.Fatalf("Failed to load certificate: %v", err)
}
_, _ = neo4j.NewDriverWithContext(dbUri, neo4j.BasicAuth(dbUser, dbPassword, ""), func(config *config.Config) {
config.ClientCertificateProvider = certProvider
})
对于轮换证书,请使用 auth.NewRotatingClientCertificateProvider()
。
该方法需要一个 ClientCertificate
实例。
password := "theCertPassword"
certProvider, err := auth.NewRotatingClientCertificateProvider(auth.ClientCertificate {
CertFile: "path/to/cert.pem",
KeyFile: "path/to/key.pem",
Password: &password,
})
if err != nil {
log.Fatalf("Failed to load certificate: %v", err)
}
_, _ = neo4j.NewDriverWithContext(dbUri, neo4j.BasicAuth(dbUser, dbPassword, ""), func(config *config.Config) {
config.ClientCertificateProvider = certProvider
})
// use the driver a bit...
// when it's time to rotate the certificate...
err = provider.UpdateCertificate(auth.ClientCertificate {
CertFile: "path/to/new_cert.pem",
KeyFile: "path/to/new_key.pem",
Password: &password,
})
if err != nil {
log.Fatalf("Failed to update certificate: %v", err)
}
// use the driver again...
有关更多信息,请参阅 API 文档 → ClientCertificateProvider
。
自定义地址解析器
创建 DriverWithContext
对象时,您可以指定一个 *解析器* 函数来解析驱动程序初始化时使用的连接地址。请注意,驱动程序在路由表中接收的地址不会通过自定义解析器进行解析。您的解析器函数将使用 ServerAddress
对象调用,并应返回 ServerAddress
对象的列表。
9999
上的 example.com
被解析为端口 7687
上的 localhost
// import "github.com/neo4j/neo4j-go-driver/v5/neo4j/config"
driver, err := neo4j.NewDriverWithContext(
"neo4j://example.com:9999", neo4j.BasicAuth(dbUser, dbPassword, ""),
func(conf *config.Config) {
conf.AddressResolver = func(address config.ServerAddress) []config.ServerAddress {
return []config.ServerAddress{
neo4j.NewServerAddress("localhost", "7687"),
}
}
})
defer driver.Close(ctx)
更多连接参数
您可以在 API 文档 → 配置包 中找到所有 DriverWithContext
配置参数。
术语表
- LTS
-
*长期支持 (LTS)* 版本是指保证在数年内获得支持的版本。Neo4j 4.4 是 LTS 版本,Neo4j 5 也将有一个 LTS 版本。
- Aura
-
Aura 是 Neo4j 的全托管云服务。它提供免费和付费方案。
- Cypher
-
Cypher 是 Neo4j 的图查询语言,可让您从数据库中检索数据。它类似于 SQL,但专用于图。
- APOC
-
Awesome Procedures On Cypher (APOC) 是一个包含(许多)无法在 Cypher 本身中轻松表达的函数的库。
- Bolt
-
Bolt 是 Neo4j 实例和驱动程序之间交互所使用的协议。它默认监听端口 7687。
- ACID
-
原子性、一致性、隔离性、持久性 (ACID) 是保证数据库事务可靠处理的属性。符合 ACID 的 DBMS 确保数据库中的数据即使在发生故障时也保持准确和一致。
- 最终一致性
-
如果数据库保证所有集群成员将在 *某个时间点* 存储最新版本的数据,则该数据库是最终一致的。
- 因果一致性
-
如果集群的每个成员都以相同的顺序看到读写查询,则数据库是因果一致的。这比 *最终一致性* 更强。
- NULL
-
null 标记不是一种类型,而是值缺失的占位符。有关更多信息,请参阅 Cypher → 处理
null
。 - 事务
-
事务是一个工作单元,它要么完整地 *提交*,要么在失败时 *回滚*。一个例子是银行转账:它涉及多个步骤,但这些步骤必须 *全部* 成功或被撤销,以避免从一个账户扣款但未添加到另一个账户的情况。
- 背压
-
背压是阻碍数据流动的力。它确保客户端不会被超出其处理能力的数据淹没。
- 事务函数
-
事务函数是
ExecuteRead
或ExecuteWrite
调用执行的回调。在服务器故障的情况下,驱动程序会自动重新执行该回调。 - DriverWithContext
-
一个
DriverWithContext
对象包含与 Neo4j 数据库建立连接所需的详细信息。