当前位置: 首页 > 知识库问答 >
问题:

如何定制SecurityContextPersistenceFilter的行为?

曾晨
2023-03-14

我开发了一个利用基于令牌的身份验证的无状态REST API,其中我通过调用SecurityContextHolder.getContext(). setAuthentication(身份验证)从自定义安全过滤器内手动将Authentication对象添加到安全上下文。我一直遇到上下文未正确设置的问题,我相信这是由于:

在请求之间存储SecurityContext

在单个会话中接收并发请求的应用程序中,相同的SecurityContext实例将在线程之间共享。尽管正在使用ThreadLocal,但从HttpSession中为每个线程检索的实例都是相同的。如果您希望临时更改线程运行的上下文,这会产生影响。如果你只是使用SecurityContextHolder。getContext(),并对返回的上下文对象调用setAuthentication(anAuthentication),则共享同一SecurityContext实例的所有并发线程中的身份验证对象都将更改。。。

您可以自定义SecurityContextPersistenceFilter的行为,为每个请求创建一个全新的SecurityContext,防止一个线程中的更改影响另一个线程。

所以问题是-如何改变SecurityContextPeristenceFilter的行为?

我希望安全上下文不与超文本传输协议会话相关联,但不希望将会话创建策略设置为无状态,因为我仍然希望实现CSRF保护等。

共有1个答案

劳仲渊
2023-03-14

今天下午我有一个确切的问题,这个开放式问题与我的搜索完全匹配,所以我想我会补充我学到的一些东西。

我们的线程正在访问同一个SecurityContext。我无法弄清楚如何直接定制SecurityContextPersistenceFilter的行为(以及在框架模式中),但是有两种方法可以让它成为线程安全的。

第一个解决方案是确保在主身份验证过滤器中创建空上下文。这涵盖了我们所有经过身份验证的请求,因此它将适用于我们的解决方案。

SecurityContextHolder.createEmptyContext();

第二件对我有效的事情是将我们的WebSecurity配置更改为无状态,我知道这对OP不起作用,但为了完整性在这里添加了它。

http.authorizeRequests()
  .anyRequest().authenticated()
  .and()
  .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
  ...

这两种解决方案对于我们的特定配置都是独立工作的。我肯定有第三种解决方案会读得更好,但我不知道它是什么,但我想。

这是我第一次发帖。我欢迎任何反馈。

 类似资料:
  • 问题内容: 可以改变外观吗? 问题答案: 您不能对控件本身进行太多修改。 由于单击与输入正确配对的元素会激活/聚焦它,因此我们可以使用a 触发OS浏览对话框。 这是您的操作方法… 表单控件的CSS将使它看起来不可见,并且不会在文档布局中占用空间,但是仍然 存在, 因此可以通过激活它。 如果要在选择后显示用户选择的路径,可以使用JavaScript侦听事件,然后读取浏览器提供给您的路径(出于安全原因

  • 对于,您可以指定订阅时发生的自定义操作。例如

  • 我有一个用例,需要跟踪给定组件的处理时间指标,并将其用作spring boot应用程序中调优的反馈循环。我想我应该在需要监视的组件中通过一个自动连接的计量服务使用一个自定义指标,该服务工作正常,我可以在/指标endpoint中看到我的指标。我遇到的问题是如何在应用程序代码中使用这些指标。理想情况下,我希望收到每个仪表提交的结果,并计算加权移动平均值。对于spring boot执行器指标来说,这不是

  • 如何定制协议 实际上制定自己的协议是比较简单的事情。简单的协议一般包含两部分: 区分数据边界的标识 数据格式定义 一个例子 协议定义 这里假设区分数据边界的标识为换行符”\n”(注意请求数据本身内部不能包含换行符),数据格式为Json,例如下面是一个符合这个规则的请求包。 {"type":"message","content":"hello"}   注意上面的请求数据末尾有一个换行字符(在PHP中

  • 本文向大家介绍如何在Spring Boot启动时运行定制的代码,包括了如何在Spring Boot启动时运行定制的代码的使用技巧和注意事项,需要的朋友参考一下 Spring Boot会自动为我们做很多配置,但迟早你需要做一些自定义工作。在本文中,您将学习如何挂钩应用程序引导程序生命周期并在Spring Boot启动时执行代码。 1.执行bean初始化的方法 Spring启动应用程序后运行某些逻辑的

  • 问题内容: 与PostgreSQL中的SQL Server或DB2或mySQL等效吗? 问题答案: 您可以像在MySQL中一样使用LIMIT,例如: