Togglz возвращает 403 на функцию переключения

Я внедрил togglz в мое приложение весенней загрузки. Я даже могу получить доступ к консоли Togglz, и я проверил ограничения с помощью FeatureManager. Однако, если я захожу в консоль togglz и пытаюсь изменить стратегию активации или включить / отключить функцию, я получаю страницу ошибки 403 Forbidden.

Другими словами, я могу получить доступ к /togglz/index, но не могу получить доступ к / call / 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;
}

В моей конфигурации Togglz:

@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 ответа

Решение

Похоже, что вы используете какую-то защиту от 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 использует средство ServiceLoader JDK для поиска поставщиков. Таким образом, в случае 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 в ваш путь к классу и добавьте к нему полное имя класса реализации.

Какая конфигурация у вас в application.yml для тогглз? Скорее всего, вы пропали secure: false там:

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

То же самое. Поскольку я новичок в Java и Spring, я застрял, когда пытался реализовать CSRFTokenProvider из решения @chkal.

Поэтому я нажимаю 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'

application.yml

      ...

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

build.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"

Примечание. Это не ответ на вопрос выше, но может быть альтернативой.

Я отключил защиту csrf в togglz через файл свойств:

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

Если вы используете yaml вместо файлов свойств, файл должен выглядеть так:

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

Обратите внимание, что отключение проверки токена csrf не рекомендуется, так как это снизит безопасность вашего приложения.

Другие вопросы по тегам