Как включить / отключить CSRF в Spring во время выполнения? - PullRequest
0 голосов
/ 04 мая 2020

У меня есть следующий класс, который имеет условие CSRF if / else. Я читаю этот флаг из файла свойств и могу изменить значение флага, используя / refre sh конечную точку. :

    @Order(-1)
    @EnableWebSecurity
    public class SomeConfigClass extends WebSecurityConfigurerAdapter {
            @Override
            protected void configure(HttpSecurity http) throws Exception {
                 String csrfFlag = somePropertyFile.getCsrfFlag();
                 if(isCsrfEnable){
                      http.csrf()....some other code
                 }else {
                      http.csrf().disable();
                 }
            }
    }

Проблема: поэтому, когда я отлаживаю код, я узнаю, что этот класс вызывается только один раз, когда контейнер Spring запускается. После этого если не будет звонить. Таким образом, даже после изменения флага CSRF в значение false, которое намерено отключить флаг CSRF, работать не будет, и будет проверка CSRF.

Чтобы избежать этого, мне нужно перезапустить / заново загрузить приложение, чтобы контейнер затем выберет конфигурацию fre sh из файлов свойств, что может привести к простою приложения. Кто-нибудь может иметь лучшее решение этой проблемы?

Цель: флаг отключения / включения CSRF должен быть выведен наружу. Можно переключить флаг и включить / отключить CSRF без перезапуска / повторной установки приложения.

1 Ответ

0 голосов
/ 04 мая 2020

Вам нужно использовать средство защиты csrf, чтобы реализовать то же самое.

Вам нужно написать CSRFProtectionMatcher.

 http.csrf().requireCsrfProtectionMatcher(new CustomCsrfProtectionMatcher())
                .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());

CustomCsrfProtectionMatcher. java

public class CustomCsrfProtectionMatcher implements RequestMatcher {


    @Override
    public boolean matches(HttpServletRequest request) {
      //based on the logic..
      //You can store flag in DB or properties or XML File
      //Please note that for every request this flag will be checked.You can choose a 
      //better way to implement this
      return true/false;
    }
}

Я лично рекомендую хранить в app.properties, а не проверять его по запросу .

...