Spring Boot整合Neo4J Docker容器时客户端认证失败求助
场景回顾
项目基于Spring Boot + Spring Data Neo4j配置,application.properties配置如下:
spring.neo4j.uri=neo4j://localhost:7687 spring.neo4j.authentication.username=neo4j spring.neo4j.authentication.password=verySecret357
自定义配置类仅声明事务管理器:
@Configuration public class Neo4jConfiguration { @Bean public ReactiveNeo4jTransactionManager reactiveTransactionManager(Driver driver, ReactiveDatabaseSelectionProvider databaseNameProvider) { return new ReactiveNeo4jTransactionManager(driver, databaseNameProvider); } }
通过Docker启动Neo4j 4.4.11社区版:
docker run -d --name neo4j -p 7474:7474 -p 7687:7687 -e 'NEO4J_AUTH=neo4j/verySecret357' neo4j:4.4.11-community
HTTP界面可正常登录,但Spring Boot应用创建节点时抛出:
org.neo4j.driver.exceptions.AuthenticationException: The client is unauthorized due to authentication failure.
调试发现客户端认证scheme正确,但authToken格式不符合预期,独立部署的Neo4j无此问题,怀疑Docker镜像相关。
排查步骤
1. 修复跨版本认证协议兼容性问题
Neo4j 5.x系列的Java驱动默认可能启用了较新的认证方案(如Bearer Token),但Neo4j 4.4.x仅支持Basic认证。需显式指定认证scheme:
在application.properties中添加:
spring.neo4j.authentication.scheme=basic
或自定义Driver Bean时手动构造Basic认证Token:
@Bean public Driver neo4jDriver() { AuthToken authToken = AuthTokens.basic("neo4j", "verySecret357"); return GraphDatabase.driver("neo4j://localhost:7687", authToken); }
2. 验证Docker容器内的认证配置是否生效
进入容器查看Neo4j配置文件,确认认证未被覆盖:
docker exec -it neo4j grep -n "dbms.security.auth_enabled" /var/lib/neo4j/conf/neo4j.conf
确保输出为dbms.security.auth_enabled=true,同时检查是否有其他认证相关配置(如LDAP、单点登录)干扰默认Basic认证。
3. 重置Docker容器的密码(避免旧数据卷干扰)
若容器首次启动时已挂载过数据卷,NEO4J_AUTH环境变量不会覆盖已存在的密码。需彻底清理容器和数据后重新初始化:
# 停止并删除容器 docker stop neo4j && docker rm neo4j # 删除关联数据卷(若未指定自定义卷,默认卷名称可通过docker volume ls查找) docker volume rm $(docker volume ls | grep neo4j | awk '{print $2}') # 重新启动容器 docker run -d --name neo4j -p 7474:7474 -p 7687:7687 -e 'NEO4J_AUTH=neo4j/verySecret357' neo4j:4.4.11-community
4. 校验Bolt端口的连通性与认证
跳过Spring框架,用原生驱动测试Bolt连接,排除Spring配置问题:
import org.neo4j.driver.AuthTokens; import org.neo4j.driver.Driver; import org.neo4j.driver.GraphDatabase; import org.neo4j.driver.Session; public class BoltTest { public static void main(String[] args) { try (Driver driver = GraphDatabase.driver("neo4j://localhost:7687", AuthTokens.basic("neo4j", "verySecret357"))) { try (Session session = driver.session()) { String result = session.run("RETURN 'Hello' AS message").single().get("message").asString(); System.out.println(result); } } catch (Exception e) { e.printStackTrace(); } } }
若测试仍失败,说明问题出在Docker容器的Bolt服务配置;若测试成功,则排查Spring Data Neo4j的自动配置是否被自定义类干扰。
5. 对齐驱动与服务器版本
Neo4j官方推荐驱动版本与服务器版本保持一致或在兼容范围内。当前使用5.2.0驱动连接4.4.11服务器,跨大版本可能存在兼容性问题。可将驱动版本降级至4.4.x系列(如4.4.11),修改pom.xml(Maven)或build.gradle(Gradle)中的依赖版本:
<!-- Maven示例 --> <dependency> <groupId>org.neo4j.driver</groupId> <artifactId>neo4j-java-driver</artifactId> <version>4.4.11</version> </dependency>
内容的提问来源于stack exchange,提问作者veebee

