我已经在我的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);
}

}

最佳答案

看起来您在应用程序中使用了某种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

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


实施CSRFTokenProvider
将文件META-INF/services/org.togglz.servlet.spi.CSRFTokenProvider添加到您的类路径中,并向其中添加实现类的标准类名。

09-26 08:22