首页 > 解决方案 > Keycloak 和 Spring Boot:会话创建策略

问题描述

我尝试使用 Spring Boot 配置 keycloak,并且我想使用自定义 Keycloak 登录页面来获取访问令牌。然后我想将此令牌传递给我的微服务中的其余端点。我的 Spring 应用程序在端口 8081 上运行。我在 keycloak 管理控制台中将有效重定向设置为http://localhost:8081/*. 现在在将登录 jsessionid 添加到 url 后重定向期间(看起来像这样http://localhost:8081/;jsessionid=session_id),我收到异常:

org.springframework.security.web.firewall.RequestRejectedException: The request was rejected because the URL contained a potentially malicious String ";"

从 Spring 安全配置中删除后,sessionCreationPolicy(SessionCreationPolicy.STATELESS)它被重定向到有效的 url KEYCLOAK_IDENTITY,但未KEYCLOAK_SESSION在浏览器存储中设置。我想知道它为什么以这种方式工作以及配置它的正确方法是什么?

我的 Spring 安全配置的一部分:

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    super.configure(http);
    http.
        csrf().disable()
        .sessionManagement()
        .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .sessionAuthenticationStrategy(sessionAuthenticationStrategy())
        .and()
        .authorizeRequests()
        .anyRequest()
        .fullyAuthenticated();
  }

标签: javaspringspring-bootspring-securitykeycloak

解决方案


如果您使用 Keycloak 示例 Spring Boot 应用程序app-authz-springboot并在 localhost 上与 keycloak 服务器一起运行它 - 您会发现它确实使用了 cookie KEYCLOAK_IDENTITY,并且KEYCLOAK_SESSION在 IDM 的身份验证阶段。您的应用程序不需要这些 cookie,但由于一切都在您的本地主机上运行,​​您将在“本地主机”域下看到它们。登录后,您可以安全地从存储中删除它们,并注意到您的应用程序运行顺利。

对于实际部署,您的 IDM 和应用程序将位于不同的域中,您将看不到这些 cookie。您的应用程序不需要它们。实际上,您唯一需要的是 JSESSIONID。


推荐阅读