Java Togglz返回403 on功能切换

Java Togglz返回403 on功能切换,java,spring-boot,togglz,Java,Spring Boot,Togglz,我已经在我的spring boot应用程序中实现了togglz。我甚至可以访问Togglz控制台,我已经用FeatureManager测试了这些限制。但是,如果我转到togglz控制台并尝试更改激活策略或启用/禁用某个功能,我会得到一个403禁止错误页面 换句话说,我可以访问/togglz/index,但不能访问/call/togglz/edit 在我的WebMVCConfiguer类中: @Bean public FilterRegistrationBean<TogglzFilter&g

我已经在我的spring boot应用程序中实现了togglz。我甚至可以访问Togglz控制台,我已经用FeatureManager测试了这些限制。但是,如果我转到togglz控制台并尝试更改激活策略或启用/禁用某个功能,我会得到一个403禁止错误页面

换句话说,我可以访问/togglz/index,但不能访问/call/togglz/edit

在我的WebMVCConfiguer类中:

@Bean
public FilterRegistrationBean<TogglzFilter> togglzRegistration() {
    FilterRegistrationBean<TogglzFilter> reg = new FilterRegistrationBean<>();
    reg.setFilter(new TogglzFilter());
    reg.addUrlPatterns("/*");
    reg.setName("TogglzFilter");
    return reg;
}

@Bean
public ServletRegistrationBean<TogglzConsoleServlet> togglzConsoleServlet() {
    ServletRegistrationBean<TogglzConsoleServlet> reg = new ServletRegistrationBean<>();
    reg.setServlet(new TogglzConsoleServlet());
    reg.setName("TogglzConsoleServlet");
    reg.addUrlMappings("/togglz/*");
    return reg;
}

您在
application.yml
中对togglz有哪些配置?最有可能的情况是您缺少
secure:false
此处:

togglz:
  enabled: true
  console:
    enabled: true
    secured: false

看起来您在应用程序中使用了某种CSRF保护。至少这可以解释为什么只有POST请求被破坏

TOGLZ控制台提供了一个SPI,用于获取需要嵌入表单中的CSRF令牌:

Togglz附带对弹簧安全CSRF保护的支持:

Togglz使用JDK的ServiceLoader工具查找提供者。因此,对于Spring安全性,只有一个引用实现类的文件:

因此,如果您想将某些第三方CSRF保护框架与Togglz集成,您必须:

  • 实施
    CSRFTokenProvider
  • 向类路径添加一个文件
    META-INF/services/org.togglz.servlet.spi.CSRFTokenProvider
    ,并向其中添加实现类的完全限定类名

    • 这里也一样。因为我是Java和Spring的新手,所以在尝试从@chkal解决方案实现CSRFTokenProvider时,我遇到了麻烦

      所以我点击了togglzapi来启用/禁用一个特性。两者都返回200 OK和HTML内容(类似于togglz控制台的索引页面)

      使能

      curl --location --request POST '{host}/{context_path}/togglz-console/edit?f=FEATURE_ONE&enabled=enabled'
      
      禁用

      curl --location --request POST '{host}/{context_path}/togglz-console/edit?f=FEATURE_ONE'
      
      application.yml

      ...
      
      togglz:
        console:
          enabled: true
          path: /togglz-console
          secured: false
          use-management-port: false
        features:
          FEATURE_ONE:
            enabled: true
      
      格雷德尔先生

      ...
      
        implementation "org.togglz:togglz-spring-boot-starter:2.6.1.Final"
        implementation "org.togglz:togglz-console:2.6.1.Final"
        implementation "org.togglz:togglz-spring-security:2.6.1.Final"
      
      注意:这不是回答上述问题,但可以作为替代方案


      更新:我经历过这种情况,因为我的InputStream已被(过滤器bean)读取,并且只读取一次

      我已通过属性文件禁用了togglz中的csrf保护:

      togglz.console.validate-c-s-r-f-token=false
      
      如果使用yaml而不是属性文件,则该文件应如下所示:

      ...
      togglz:
        console:
          validate-c-s-r-f-token: false
      

      您应该注意,不建议禁用csrf令牌验证,因为它会降低应用程序的安全性。

      不,它不会改变任何东西。我应该注意,导致403的url不是/togglz/index,而是/togglz/edit您没有使用togglz-spring-boot-starter,这就是为什么配置不起作用。我强烈建议您使用togglz spring boot starter:您是对的,我不是。但这是因为togglz spring boot starter依赖于spring security类,而我的服务不使用spring security,而是使用OAuth2在所有服务上进行单点登录。SpringSecurityUserProvider类是一个togglz类,如果可能的话,我将研究实现它,该模块是@ConditionalOnMissingClass org.springframework.security.config.annotation.web.configuration.EnableWebSecurity,我拥有该模块。Togglz控制台支持Spring security和friends提供的CSRF令牌。我可以想象这会给你带来一些问题。看:所以我想如果你有一些CSRF保护,而不是与Togglz集成,这可能会发生……我们确实有!这将解释为什么控制台是可访问的,但编辑请求(如果是REST或其他)不会触发。您是否有使用togglz实现的示例或文档?谢谢你的回复,这意味着非常抱歉耽搁了。请看下面我的答案。我让spring security打开了csrf,并且遇到了同样的问题。我只需要添加依赖项
      org.togglz:togglz-spring-security
      ,这很有帮助。
      togglz.console.validate-c-s-r-f-token=false
      
      ...
      togglz:
        console:
          validate-c-s-r-f-token: false