Keycloak+Spring Boot登录报空指针:getAuthUrl()返回null
Keycloak + Spring Boot 认证服务500错误排查
问题现象
通过Docker Compose部署Keycloak并关联PostgreSQL,结合Spring Boot搭建认证服务,曾正常登录获取Token,后续测试时出现500服务器错误,报错信息:
java.lang.NullPointerException: Cannot invoke "org.keycloak.common.util.KeycloakUriBuilder.clone()" because the return value of "org.keycloak.adapters.KeycloakDeployment.getAuthUrl()" is null
相关配置与代码
Docker Compose配置
version: '3' volumes: postgres_data: driver: local services: postgres: image: postgres volumes: - postgres_data:/var/lib/postgresql/data environment: POSTGRES_DB: keycloak_local POSTGRES_USER: keycloak POSTGRES_PASSWORD: keycloak keycloak: image: quay.io/keycloak/keycloak:legacy environment: DB_VENDOR: POSTGRES DB_ADDR: postgres DB_DATABASE: keycloak_local DB_USER: keycloak DB_SCHEMA: public DB_PASSWORD: keycloak KEYCLOAK_USER: admin KEYCLOAK_PASSWORD: admin ports: - 8080:8080 depends_on: - postgres
Spring Boot应用配置
server.port = 8090 keycloak.realm=lbv-realm keycloak.resource=auth-client keycloak.auth-server-url=http://localhost:8080/auth keycloak.ssl-required=none keycloak.public-client=true
Keycloak配置类
@Bean public KeycloakSpringBootConfigResolver keycloakConfigResolver() { return new KeycloakSpringBootConfigResolver(); }
登录服务方法
public ResponseEntity<LoginResponse> login(LoginRequest loginrequest) { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); MultiValueMap<String, String> map = new LinkedMultiValueMap<>(); map.add("client_id",client_id ); map.add("client_secret", client_secret); map.add("grant_type", grant_type); map.add("username", loginrequest.getUsername()); map.add("password", loginrequest.getPassword()); HttpEntity<MultiValueMap<String, String>> httpEntity = new HttpEntity<>(map,headers); ResponseEntity<LoginResponse> response = restTemplate.postForEntity("http://localhost:8080/auth/realms/lbv/protocol/openid-connect/token", httpEntity, LoginResponse.class); return new ResponseEntity<>(response.getBody(),HttpStatus.OK); }
登录控制器
@PostMapping("/login") public ResponseEntity<LoginResponse> login (@RequestBody LoginRequest loginrequest) { return loginservice.login(loginrequest); }
排查与解决思路
1. 确认Keycloak服务可用性
- 执行
docker-compose ps检查keycloak容器状态,若未启动则用docker-compose up -d keycloak重启 - 访问
http://localhost:8080/auth/admin,确认能正常登录管理控制台,且lbv-realm和auth-client配置未被修改
2. 验证配置一致性
- 核对
keycloak.realm=lbv-realm与Keycloak中实际Realm名称完全一致(注意大小写) - 测试
keycloak.auth-server-url=http://localhost:8080/auth的连通性,执行curl http://localhost:8080/auth,确保返回正常页面
3. 修复空指针核心问题
该错误是因为KeycloakDeployment未正确加载配置导致authUrl为空,可尝试:
- 确认Spring Boot配置文件在
src/main/resources目录下,且未被其他配置覆盖 - 重启Spring Boot应用,确保最新配置生效
- 由于配置中
keycloak.public-client=true,公开客户端无需传递client_secret,删除登录请求中的map.add("client_secret", client_secret);代码行
4. 检查数据库连接
- 查看Keycloak容器日志
docker-compose logs keycloak,排查是否有数据库连接失败的报错 - 若数据库数据损坏,执行
docker-compose down -v删除数据卷,再docker-compose up -d重新初始化数据库与Keycloak
内容的提问来源于stack exchange,提问作者Nouhaila Khaouti
相关产品推荐
相关产品推荐

