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