java - 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();
}
解决方案
如果您使用 Keycloak 示例 Spring Boot 应用程序app-authz-springboot并在 localhost 上与 keycloak 服务器一起运行它 - 您会发现它确实使用了 cookie KEYCLOAK_IDENTITY
,并且KEYCLOAK_SESSION
在 IDM 的身份验证阶段。您的应用程序不需要这些 cookie,但由于一切都在您的本地主机上运行,您将在“本地主机”域下看到它们。登录后,您可以安全地从存储中删除它们,并注意到您的应用程序运行顺利。
对于实际部署,您的 IDM 和应用程序将位于不同的域中,您将看不到这些 cookie。您的应用程序不需要它们。实际上,您唯一需要的是 JSESSIONID。
推荐阅读
- python - 如何在保持一个相同的同时迭代两个范围?
- flutter - 在flutter中进入暗模式时更改系统导航和状态栏的颜色
- python - 无法使用 Python 恢复交互式反向 shell
- python - 如何根据数据框的值更改边缘颜色
- python - 列表理解的加载时间比执行相同操作的常规代码慢得多
- excel - VBA - 跳过损坏的文件
- python - 使用 multiprocessing.map 时如何节省内存?
- laravel - 在 laravel 中使用惯性时如何引用 .vue 文件中的资产?
- swift - 如何在 Swift 5 中将指定的持续时间添加到字符串日期
- java - 局部变量初始化错误java