1

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

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

在我的 WebMvcConfigurer 类中:

@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;
}

在我的 TogglzConfiguration 中:

@Component
public class TogglzConfiguration implements TogglzConfig {
private static final Logger LOGGER = LoggerFactory.getLogger(TogglzConfiguration.class);

@Autowired
private ResourceLoader resourceLoader;

@Override
public Class<? extends Feature> getFeatureClass() {
    return Features.class;
}

@Override
public StateRepository getStateRepository() {
    try {
        return new FileBasedStateRepository(
                resourceLoader.getResource("classpath:/togglz.properties").getFile()
                );
    } catch (IOException ex) {
        LOGGER.error(ex.getMessage(),ex);
        throw new RuntimeException(ex);
    }

}

@Override
public UserProvider getUserProvider() {

    return new UserProvider() {
        @Override
        public FeatureUser getCurrentUser() {
                return new SimpleFeatureUser("admin", true);
        }
    };
}


}

我的功能类:

public enum Features implements Feature {

@Label("Inventory Initiation")
@TestingUI
TESTING_UI_INITIATE_INVENTORY,

@Label("Random Warehouse Creation")
@TestingUI
TESTING_UI_CREATE_WAREHOUSE
;


public boolean isActive() {
    return FeatureContext.getFeatureManager().isActive(this);
}

}
4

4 回答 4

1

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

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

https://github.com/togglz/togglz/blob/master/servlet/src/main/java/org/togglz/servlet/spi/CSRFTokenProvider.java

Togglz 附带对 Spring Security CSRF 保护的支持:

https://github.com/togglz/togglz/blob/master/spring-security/src/main/java/org/togglz/spring/security/SpringSecurityTokenProvider.java

Togglz 正在使用 JDK 的 ServiceLoader 工具来查找提供程序。所以在 Spring Security 的情况下,只有一个引用实现类的文件:

https://github.com/togglz/togglz/blob/master/spring-security/src/main/resources/META-INF/services/org.togglz.servlet.spi.CSRFTokenProvider

因此,如果您想将一些 3rd 方 CSRF 保护框架与 Togglz 集成,您必须:

  • 实施CSRFTokenProvider
  • 将一个文件添加META-INF/services/org.togglz.servlet.spi.CSRFTokenProvider到您的类路径中,并将实现类的完全限定类名添加到其中。
于 2018-08-04T06:53:06.700 回答
0

application.yml对togglz有什么配置?你很可能在secure: false那里失踪:

togglz:
  enabled: true
  console:
    enabled: true
    secured: false
于 2018-07-26T13:20:58.840 回答
0

同样在这里。由于我是 Java 和 Spring 的新手,所以在尝试从 @chkal 解决方案实现 CSRFTokenProvider 时我卡住了。

所以我点击了 Togglz API 来启用/禁用一个功能。两者都返回 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'

应用程序.yml

...

togglz:
  console:
    enabled: true
    path: /togglz-console
    secured: false
    use-management-port: false
  features:
    FEATURE_ONE:
      enabled: true

构建.gradle

...

  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)并且只读取一次

于 2021-03-14T11:26:57.133 回答
0

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

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

如果您使用 yaml 而不是属性文件,则该文件应如下所示:

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

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

于 2021-03-29T16:33:54.543 回答