Spring Boot Security和Key斗篷-在使用HTTPS成功登录后接收403禁止/so/login



我有一个Spring Boot应用程序,使用Spring Security和Keycloft作为IDP。

钥匙斗篷可在https://auth.example.com,具有一个带有客户端backo核心的领域backo和一个配置了所需角色的testuser。

如果我使用配置本地应用程序

keycloak.enabled=true
keycloak.auth-server-url=https://auth.example.com/auth
keycloak.realm=backo
keycloak.public-client=true
keycloak.resource=backo-core
keycloak.ssl-required=external
keycloak.confidential-port=443

一切都很好。

如果我将其部署到我的DEV环境中https://backo.example.com/backo具有https://backo.example.com/sso/login,当访问该应用程序时,我会重定向到Key斗篷登录。成功登录后,我被重定向到带有状态、会话状态和代码参数的重定向URL,但收到403。https://backo.example.com/sso/login?state=...&session_state=&代码=。。。请求启动器链来自https://auth.example.com/auth/realms/backo/login-action/authenticate?...

如果我在本地设置keycapture.sslrequired=all,那么访问登录页面时的redirect_url参数为https://localhost/sso/login,所以我可以手动将其更改为http://localhost:8080/sso/login.成功登录后,我遇到了与403 Forbidden响应完全相同的问题http://localhost:8080/sso/login?state=...&session_state=&代码=。。。

请求启动器链来自https://auth.example.com/auth/realms/backo/login-action/authenticate?...

这就是我的安全配置看起来像的样子

protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
http
.authorizeRequests()
.antMatchers("/backo").hasAnyRole(ROLE_ADMIN, ROLE_BACKOFFICE)
.anyRequest().permitAll();
http.csrf().disable();
http.headers().frameOptions().disable(); // otherwise Vaadin doesn't work properly
http
.logout()
.addLogoutHandler(keycloakLogoutHandler())
.logoutUrl("/sso/logout").permitAll()
.logoutSuccessUrl("/");
}

您可以忽略这个Vaadin解决方法,因为它已经在/so/login中失败了。http.csrf((.disable((;需要在授权时防止发布请求时出现其他403禁止错误。

有一件事值得一提:Spring Boot应用程序没有启用HTTPS,在我们的开发环境中,它位于AWS应用程序负载均衡器ALB后面。HTTPS在ALB中终止。

三天前,我们在spring boot thymelaf应用程序中遇到了类似的问题。我们已经使用了钥匙斗篷适配器(13.0.1(的弹簧靴。

成功登录后,重定向到/so/login页面,出现403错误。

经过大量的努力,我们终于得到了解决这个问题所需的配置。您需要使用以下应用程序属性:

server.use-forward-headers=true
keycloak.public-client=true
keycloak.ssl-required=all
keycloak.confidential-port=443

最新更新