高级连接信息
连接协议和安全性
驱动程序和服务器之间的通信通过 Bolt 协议进行。服务器 URI 的方案决定了连接是否加密,如果加密,则决定接受哪种类型的证书。
URL 方案 | 加密 | 注释 |
---|---|---|
neo4j |
本地设置的默认值 |
|
neo4j+s |
(仅限 CA 签名证书) |
Aura 的默认值 |
neo4j+ssc |
(CA 签名和自签名证书) |
无论实例是适当的集群环境还是单机环境,驱动程序在成功连接后都会从服务器接收一个路由表。驱动程序的路由行为与Neo4j 的集群协同工作,将读/写事务定向到适当的集群成员。如果您想针对特定机器,请改用 bolt 、bolt+s 或 bolt+ssc URI 方案。 |
要使用的连接方案不是您的选择,而是由服务器要求决定的。您必须事先知道正确的服务器方案,因为在连接之前不会暴露任何元数据。如果您不确定,请咨询数据库管理员。
认证方法
基本认证
基本认证方案依赖于传统的用户名和密码。这些可以是您的本地安装凭据,也可以是 Aura 实例提供的凭据。
const driver = neo4j.driver(URI, neo4j.auth.basic(USER, PASSWORD))
基本认证方案也可以用于针对 LDAP 服务器进行认证(仅限企业版)。
Kerberos 认证
Kerberos 认证方案需要一个 base64 编码的票据。只有在服务器已安装 Kerberos 附加组件时才能使用。
const driver = neo4j.driver(URI, neo4j.auth.kerberos(ticket))
Bearer 认证
Bearer 认证方案需要一个由身份提供者通过 Neo4j 的单点登录功能提供的 base64 编码令牌。
const driver = neo4j.driver(URI, neo4j.auth.bearer(token))
轮换认证令牌
可以轮换预期会过期的认证令牌(例如 SSO)。在实例化 Driver
时,您需要提供一个 AuthTokenManager
实例,而不是一个静态认证令牌。
最简单的入门方法是使用内置的 AuthTokenManager
实现之一。
import neo4j, { AuthToken } from 'neo4j-driver'
/**
* Method called whenever the driver needs to refresh the token.
*
* The refresh will happen if the driver is notified by the server
* of token expiration, or if `Date.now() > tokenData.expiry`.
*
* The driver will block creation of all connections until
* this function resolves the new auth token.
*/
async function generateAuthToken () {
const bearer = await getSSOToken() // some way to get a token
const token = neo4j.auth.bearer(bearer)
// assume we know tokens expire every 60 seconds
const expiresIn = 60
// Include a little buffer so that new token is fetched before the old one expires
const expiration = expiresIn - 10
return {
token,
// if expiration is not provided,
// the driver will only fetch a new token when an auth failure happens
expiration
}
}
const driver = neo4j.driver(
URI,
neo4j.authTokenManagers.bearer({
tokenProvider: generateAuthToken
})
)
AuthManagers (包括传递给 expirationBasedAuthTokenManager() 的提供函数)不得以任何方式与驱动程序交互,因为这可能导致死锁和未定义行为。 |
相互 TLS (客户端证书作为双因素认证)
相互 TLS (mTLS) 允许您使用客户端证书作为与服务器进行认证的第二因素。证书只能与认证令牌一起使用,并且不能替代常规认证,除非服务器上禁用了认证。
客户端的证书和公钥必须放置在服务器的 <NEO4J_HOME>/certificates/bolt/trusted
目录中。有关服务器设置的更多信息,请参阅配置基于 Bolt 的 SSL。
为了使 mTLS 工作,驱动程序与服务器的连接必须加密,即连接 URI 方案必须是 +s 或 +ssc (例如 neo4j+s://example.com:7687 )。 |
使用驱动程序配置选项 clientCertificate
以对象形式提供证书信息。
const driver = neo4j.driver(URI, neo4j.auth.basic(USER, PASSWORD), {
clientCertificate: {
certfile: '/path/to/cert.cert',
keyfile: '/path/to/cert.pem',
password: 'the_key_password' // optional
}
})
通过 clientCertificateProviders.rotating
实例化证书对象,并在通过配置选项 clientCertificate
实例化驱动程序时提供它。
const initialClientCertificate: {
certfile: '/path/to/cert.cert',
keyfile: '/path/to/cert.pem',
password: 'the_key_password' // optional
}
const clientCertificateProvider = neo4j.clientCertificateProviders.rotating({
initialCertificate: initialClientCertificate
})
const driver = neo4j.driver(URI, MY_CREDENTIALS, {
clientCertificate: clientCertificateProvider
})
// use the driver...
// ... until it's time to update the certificate
clientCertificateProvider.updateCertificate({
certfile: '/path/to/new_cert.cert',
keyfile: '/path/to/new_cert.pem',
password: 'the_new_key_password' // optional
})
// use the driver some more
自定义地址解析器
创建 Driver
对象时,可以指定一个解析器函数来解析驱动程序初始化时使用的连接地址。请注意,驱动程序在路由表中接收到的地址不会使用自定义解析器进行解析。
example.com
的端口 9999
被解析为 localhost
的端口 7687
let URI = 'neo4j://example.com:9999'
let addresses = [
'localhost:7687'
]
let driver = neo4j.driver(URI, neo4j.auth.basic(USER, PASSWORD), {
resolver: address => addresses
})
其他连接参数
您可以在API 文档中找到所有 Driver
配置参数。
术语表
- LTS
-
长期支持版本是保证在数年内获得支持的版本。Neo4j 4.4 是 LTS,Neo4j 5 也将有一个 LTS 版本。
- Aura
-
Aura 是 Neo4j 的全托管云服务。它提供免费和付费计划。
- Cypher
-
Cypher 是 Neo4j 的图查询语言,它允许您从数据库中检索数据。它类似于 SQL,但专用于图。
- APOC
-
Cypher 上的出色过程 (APOC) 是一个包含(许多)无法在 Cypher 本身中轻松表达的函数的库。
- Bolt
-
Bolt 是 Neo4j 实例和驱动程序之间交互所使用的协议。它默认监听端口 7687。
- ACID
-
原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)(ACID) 是保证数据库事务可靠处理的特性。符合 ACID 的 DBMS 确保数据库中的数据在发生故障时仍能保持准确和一致。
- 最终一致性
-
如果一个数据库保证所有集群成员都将在某个时间点存储最新版本的数据,那么它就是最终一致的。
- 因果一致性
-
如果集群的每个成员都以相同的顺序看到读写查询,那么数据库就是因果一致的。这比最终一致性更强。
- NULL
-
空标记不是一种类型,而是值缺失的占位符。有关更多信息,请参阅Cypher → 使用
null
。 - 事务
-
事务是一个工作单元,它要么整体提交,要么在失败时回滚。一个例子是银行转账:它涉及多个步骤,但它们必须全部成功或回退,以避免资金从一个账户中扣除但未添加到另一个账户的情况发生。
- 背压
-
背压是阻碍数据流动的力。它确保客户端不会被超出其处理能力的数据量所淹没。
- 事务函数
-
事务函数是
executeRead
或executeWrite
调用执行的回调。在服务器故障的情况下,驱动程序会自动重新执行该回调。 - 驱动程序
-
一个
Driver
对象包含与 Neo4j 数据库建立连接所需的详细信息。