【问题标题】:Keycloak and Spring Boot: session creation policyKeycloak 和 Spring Boot:会话创建策略
【发布时间】:2020-02-22 10:30:04
【问题描述】:

我尝试使用 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_IDENTITYKEYCLOAK_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();
  }

【问题讨论】:

    标签: java spring spring-boot spring-security keycloak


    【解决方案1】:

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

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

    【讨论】:

    • 在实际部署的场景中,当IDM和应用在不同的域时,我们有什么办法可以使用cookie吗?
    猜你喜欢
    • 2017-09-17
    • 2019-11-20
    • 2017-08-15
    • 1970-01-01
    • 2022-09-28
    • 1970-01-01
    • 2016-08-10
    • 1970-01-01
    • 2015-12-23
    相关资源
    最近更新 更多