【问题标题】:Configure Spring HTTP Security at Runtime在运行时配置 Spring HTTP 安全性
【发布时间】:2023-03-17 21:04:01
【问题描述】:

在启动时应用所有 http 安全性:

protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
        .antMatchers("/admin/**").hasRole("admin")
}

在运行时,我正在尝试添加更多内容...

applicationContext.getBean(WebSecurityConfigurerAdapter).http.authorizeRequests().antMatchers("bla").hasRole("admin")

执行该行时,会将其添加到 http.authorizeRequests() 中,但“非管理员”仍可访问 /bla

服务器重启后,此更改生效,因为它正在从数据库中加载 bla。

如何在不重新启动服务器的情况下使安全立即生效?

【问题讨论】:

  • 你有解决办法吗?
  • 不,如果你知道请分享:D

标签: spring spring-security


【解决方案1】:

您正在尝试在运行时动态更改 Spring bean,除非您使用 spring-loaded 或 JRebel 等工具,否则这很难做到。 有很多关于它的内容:

  1. Update spring beans dynamically. Is it possible?
  2. dynamically change spring beans
  3. Can I replace a Spring bean definition at runtime?

(在我看来)您的用例的最佳方法是使用弹簧配置文件。
定义一个具有 /bla 权限的 bean 和另一个没有 /bla 权限的 bean。然后在不同的配置文件中使用它们。

dynamically declare beans at runtime in Spring

【讨论】:

  • 这里的问题是他在修改配置bean。如果底层链是可访问的,我认为在运行时修改 securityfilterchain 将是一个选项。但确实有很多 spring bean 不是为此而设计的,你需要用委托包装这些 bean,这样你就可以在需要时重建单例。
  • 其 100% 动态的配置文件 + 每个配置文件的类不起作用,因为无法知道可能性。 http.authorizeRequests().urlMappings 在运行时获取新项目,但是当 URL 被命中时 spring 没有看到它。
猜你喜欢
  • 2011-01-29
  • 2019-04-03
  • 2015-02-22
  • 2015-11-18
  • 2017-02-04
  • 2014-03-25
  • 2017-07-01
  • 2017-02-09
  • 2013-06-13
相关资源
最近更新 更多