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

惰性在运行时初始化Spring Security性重新加载Spring Security配置

燕元明
2023-03-14

Spring通常在启动应用程序时急切地加载Spring Security配置。我正在使用OAuth和Spring Security

我正在维护一个配置表,用于存储与SSO相关的值(如jwk url、client\u id、client\u secret)。该值将由管理员用户通过CRUD在同一spring boot应用程序中填充。

然后只有jwk-url可用于在Spring Security配置中配置(请参阅下面的代码-jwkSetUri(...))。这在应用程序启动时不可用。

因此,我想在将值加载到表中后初始化Spring Security配置,就像在运行时延迟加载(@lazy)。我知道如何延迟加载常规类/服务。

>

另一件事是如何在运行时刷新/重新加载Spring Security配置,如果管理员更改了JWK url。那么只有Spring Security配置才能生效更改。

@Configuration
@EnableWebSecurity
public class ResourceServerConfiguration extends WebSecurityConfigurerAdapter {
    
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.cors()
                .and()
                .csrf().disable()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
                .authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .oauth2ResourceServer()
                .authenticationEntryPoint(oAuth2AuthenticationEntryPoint)
                .accessDeniedHandler(oAuth2AccessDeniedHandler)
                .jwt()
                 // Some Auth server URL which would be fetch from table
                .jwkSetUri(ssoConfigService.getActiveSSOCertificateURL()); 
                 // Eg. http://localhost:8090/auth/realms/demo-app/protocol/openid-connect/certs
    }
}

我已经提到了这些链接。但这对我的目的没有帮助。任何帮助都将不胜感激。

如何延迟加载Spring Security性?

当应用程序启动并运行时,如何重新加载WebSecurityConfigureAdapter的配置方法

在运行时修改Spring Security配置

在运行时配置Spring HTTP安全

共有1个答案

卢黎昕
2023-03-14

请检查此链接在运行时自定义CORS过滤,其中包含与您相关的类似用例,但对他来说,他需要动态更改允许的来源。他们决定创建一个新的过滤器并简单地扩展OncePerRequest estFilter。

考虑检查您用例的OAuth2ResourceServerProperties。

更新:尝试使用此场景的此代码:

另一件事是如何在运行时刷新/重新加载Spring Security配置,如果管理员更改了JWK url。那么只有Spring Security配置才能生效更改。

 @Override
    public void configure(HttpSecurity http) throws Exception {
        http.cors()
                .and()
                .csrf().disable()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
                .authorizeRequests()
                .anyRequest().authenticated()

                // TODO: test with and without this and check if work for you
                .and()
                .oauth2ResourceServer()
                .authenticationEntryPoint(oAuth2AuthenticationEntryPoint)
                .accessDeniedHandler(oAuth2AccessDeniedHandler)
                .jwt()
                // Some Auth server URL which would be fetch from table
                .jwkSetUri(ssoConfigService.getActiveSSOCertificateURL());
        // Eg. http://localhost:8090/auth/realms/demo-app/protocol/openid-connect/certs

        http.addFilterBefore(new OncePerRequestFilter() {
            // Every time a request occur, this method will be called.
            @Override
            protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {

                try {
                    http.oauth2ResourceServer()
                            .authenticationEntryPoint(oAuth2AuthenticationEntryPoint)
                            .accessDeniedHandler(oAuth2AccessDeniedHandler)
                            .jwt()
                            // Some Auth server URL which would be fetch from table
                            .jwkSetUri(ssoConfigService.getActiveSSOCertificateURL());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }, BasicAuthenticationFilter.class);
    }

我希望这个信息可以帮助你。

 类似资料:
  • 我正在开发一个Struts2 Spring Hibernate webapp,我需要在检索一个对象或该对象的集合后初始化一个惰性集合。 用例 我有一个团队模型,其关系被热切地加载为员工(我认为这显然是一个集合)。反过来,员工模型有一个懒惰的关系注册表,我只需要一些特定的操作,所以我根本不需要急切地加载它。 现在。我调用我的(用Spring注入到我的Struts2控制器中),以便检索一个特定的已经加

  • 问题内容: 您将如何在Swift中实现以下模式? 所述类被初始化,其中包含的词典JSON数组。这些字典用于初始化类。但是,当访问或属性时,对象的初始化会延迟进行。 问题答案: 看来这个问题已经得到了很大的回答,但是回过头来看原始帖子,这是(IMHO)Swift中相对简洁的翻译。关键是您可以链接惰性属性。请注意,我同时使用了类函数和闭包- 两者都很好。

  • 延迟初始化 是一种允许我们延迟初始化消耗资源比较大的进程,直到需要他们的时候(才初始化)。这其中的一个例子就是jQuery的.ready()方法,它在DOM节点加载完毕之后会执行一个回调方法。 $( document ).ready( function () { //ajax请求不会执行,直到DOM加载完成 var jqxhr = $.ajax({ url: "ht

  • 我在我的WordPress网站上使用JetPack,并启用了延迟加载。然而,在我的网站中,我用AJAX更新了一些内容,这导致加载1x1占位符的图像,而不是真正的图像,这是懒惰加载会处理的。 如何使用Jet Pack再次调用延迟加载?我似乎记得有一个JavaScript函数,但找不到它是什么。

  • 问题内容: 我有一个初始化为的变量: 问题是,在某个时候,我需要重置此变量,以便在更改后可以再次初始化。但是如果我将类设置为可选的话,LLVM在尝试将它设置为时会给我一个错误。如果我只是使用将其重置在代码中的某个位置,它将最终显示为。 有没有一种方法可以使用并允许自己重置? 问题答案: 懒惰是明确的仅一次初始化。您要采用的模型可能只是按需初始化模型: 现在,只要是,它会被初始化并返回。可以通过设置

  • 问题内容: 加载视图时,我想在其关联的控制器中运行一些初始化代码。 为此,我在视图的主要元素上使用了ng-init指令: 并在控制器中: 第一个问题:这是正确的方法吗? 接下来,事件顺序发生了问题。在视图中,我有一个“保存”按钮,它使用如下指令: 该功能在控制器中定义: 如您所见,它使用在函数中初始化的标志。 问题:该视图被加载的情况下,isClean函数被调用 之前的功能,因此,该标志是。我该怎