JHipster生产环境中公共首页为何重定向至Keycloak登录页?
问题描述
- 用JHipster生成的Spring Boot + React应用,开发模式(先启动Keycloak,再以调试模式运行Java后端,最后用
npm start启动React前端)下,9000端口可正常匿名访问首页; - 但生产部署模式(Maven打jar包后用
java -jar运行)下,8080端口访问首页时,页面刚显示不到1秒就被重定向至Keycloak登录页; - 排查发现:首页加载后发起的
/categories、/account、/info等请求因权限不足触发认证重定向; - 已完成的配置:
- application.yml中启用CORS:
cors: allowed-origins: "http://localhost:8100,http://localhost:9000,https://mywebsite.com,https://www.mywebsite.com" allowed-methods: "*" allowed-headers: "*" exposed-headers: "Authorization,Link,X-Total-Count,X-${jhipster.clientApp.name}-alert,X-${jhipster.clientApp.name}-error,X-${jhipster.clientApp.name}-params" allow-credentials: true max-age: 1800 - Java Security配置中放行了静态资源:
.requestMatchers(mvc.pattern("/index.html"), mvc.pattern("/"), mvc.pattern("/*.js"), mvc.pattern("/*.txt"), mvc.pattern("/*.json"), mvc.pattern("/*.map"), mvc.pattern("/*.css")).permitAll()
- application.yml中启用CORS:
解决办法
给公共API添加放行规则
你当前仅放行了静态资源,但首页调用的/categories、/info这类设计为公开访问的接口,必须在Security配置中同步添加放行:// 示例:将公共API加入permitAll规则 .requestMatchers(mvc.pattern("/api/categories/**"), mvc.pattern("/info")).permitAll() // 注意:/account接口默认需要登录才能访问,如果前端未登录就调用了它,要么修改前端逻辑(未登录时不调用),要么根据业务需求决定是否放行该接口务必确保所有前端匿名状态下会触发的接口,都被加入
permitAll()规则,否则这类接口会触发认证重定向,导致整个页面跳转到登录页。检查前端API调用逻辑
开发模式下可能因代理或调试环境的权限逻辑差异未暴露问题,但生产环境中如果前端在未登录时就调用了/account这类需要认证的接口,会直接触发重定向。需要:- 查看React代码,确认首页加载时是否自动调用了
/account(比如获取当前用户信息的逻辑); - 如果该接口无需在匿名状态下调用,修改逻辑:仅在用户登录后发起请求,或添加判断,未登录时跳过该调用。
- 查看React代码,确认首页加载时是否自动调用了
验证生产环境Security配置是否生效
JHipster在生产模式下可能会使用单独的配置文件(如application-prod.yml),需检查你的Security配置是否仅在开发环境生效,生产环境未同步修改:- 确认
SecurityConfiguration类是否全局生效,是否存在针对生产环境的特殊配置类; - 检查
application-prod.yml中是否有覆盖Security规则的配置,比如是否开启了全局强制认证规则。
- 确认
检查Keycloak客户端配置
确认Keycloak客户端的Access Type设置:如果是public类型,不要开启强制所有请求认证;另外检查Valid Redirect URIs是否包含生产环境域名(如https://mywebsite.com/*),避免重定向出现异常。
内容的提问来源于stack exchange,提问作者Galilo Galilo
相关产品推荐
相关产品推荐

