身份验证和授权

本节描述了 Neo4j 身份验证和授权的重大更改和弃用。

删除用于身份验证和授权的平面文件

Neo4j 3.x 在平面文件中管理身份验证和授权。

Neo4j 4.0 引入了一个存储在system 图中的复杂安全模型,该模型在称为system 数据库的特殊数据库中维护。authroles 文件的内容会自动迁移到system 数据库。如果您要将来自多个 Neo4j 3.5 部署的多个数据库组合在一起或升级集群,则必须在迁移之前手动合并authrole 文件。

neo4j-admin 命令set-initial-passwordset-default-admin 在 4.0 版中继续有效,并写入与 3.5 版中相同的文件。安装新版本后,在 Neo4j 首次启动时会考虑这些文件中的任何内容。

仅当默认用户neo4j 且默认密码是唯一的用户时,才会应用set-initial-password 命令,而set-default-admin 仅在没有角色时才会使用。有关更多信息,请参阅操作手册 4.0 → 设置初始密码

基于角色的访问控制

Neo4j 3.1 引入了基于角色的访问控制的概念。可以创建用户并将他们分配给角色,以控制他们是否可以读取、写入和管理数据库。在 Neo4j 4.0 中,此模型通过添加权限得到了显着增强,权限是定义用户权限的基础访问控制规则。

在迁移后,仍然可以为每个数据库设置不同的安全配置,但这需要通过授予特定于数据库的权限和角色来管理。3.5 中的内置角色仍然存在,但在迁移后将应用于所有数据库,除非使用新的安全管理命令明确修改。有关管理特定于数据库的角色和权限的功能的更详细说明,请参阅Cypher® 手册 4.0 → 管理

不再可以在集群的不同实例上拥有不同的安全权限。整个集群共享使用 Cypher 管理命令在system 数据库中配置的权限。在实践中,这意味着无论用户访问集群中的哪个服务器,他们都拥有相同的权限。

已弃用和删除的安全过程

Neo4j 3.x 中用于用户管理的内置安全过程dbms.security 在 4.x 中已弃用。如果您仍然想要使用它们,则必须针对system 数据库运行它们,并且不能后跟YIELD

有两种选择可以重写用于管理身份验证和授权的代码和例程。

  • (推荐) 将过程重写为相应的 Cypher 管理命令,使用xref: version-4/migration/surface-changes/auth.adoc#convert-security-procedures-table[转换表]。所有管理命令都必须针对system 数据库执行。当使用 Neo4j 驱动程序(Bolt 协议)连接到 DBMS 时,管理命令会自动路由到系统数据库(Neo4j 4.1+)。

  • 针对system 数据库运行过程,并将任何YIELD 部分替换为应用程序端的后处理。

自相应的 Cypher 管理命令也需要旧密码以来,过程dbms.security.changePassword(password, requirePasswordChange) 已完全删除,因此更安全。
表 1. 过程到 Cypher 管理命令转换
过程 管理命令

dbms.security.createUser

CREATE USER

dbms.security.deleteUser

DROP USER

dbms.security.changePassword

ALTER CURRENT USER SET PASSWORD

dbms.security.listUsers

SHOW USERS

dbms.security.changeUserPassword

ALTER USER

dbms.security.suspendUser

ALTER USER

dbms.security.activateUser

ALTER USER

dbms.security.addRoleToUser

GRANT ROLE TO USER

dbms.security.removeRoleFromUser

REVOKE ROLE FROM USER

dbms.security.listRoles

SHOW ROLES

dbms.security.listRolesForUser

SHOW USERS

dbms.security.listUsersForRole

SHOW ROLES WITH USERS

dbms.security.createRole

CREATE ROLE

dbms.security.deleteRole

DROP ROLE

有关管理命令的更多信息,请参阅Cypher 手册 4.0 → 用户和角色管理