Spring Boot защищает одну и ту же конечную точку с помощью токена CSRF и BasicAuth - PullRequest
0 голосов
/ 17 октября 2018

У меня есть приложение Spring Boot REST, которое состоит из двух основных частей:

  • Пользовательский интерфейс, в котором я хочу защитить вызовы ajax с помощью токена
  • общедоступных конечных точек, где я хочу иметьБазовая аутентификация

Насколько я понимаю, я не могу защитить публичные конечные точки с помощью токенов CSRF, поскольку для них требуется сеанс.Проблема в том, что некоторые конечные точки должны быть доступны обоим, так как я могу защитить их с помощью CSRF, когда он используется в пользовательском интерфейсе, и отключить CSRF для базовой аутентификации?

Вот то, что у меня сейчас есть, где яполностью отключить csrf, так что основные работы ...

http.requestMatchers().antMatchers("/form/fill", "/form/fill/*", "/form/fillParams", "/form/fillParams/*").and()
                .csrf().disable().authorizeRequests().anyRequest().hasAnyRole(SecurityConfiguration.ROLE_FORMS_AUTHOR,
                        SecurityConfiguration.ROLE_FORM_FILLER, SecurityConfiguration.ROLE_ADMIN)
                .and().httpBasic();

РЕДАКТИРОВАТЬ: Я нашел этот старый ответ, и мне интересно, есть ли способ, которым я могу использовать это для моего случая, но я 'Я до сих пор не уверен, как отличить «локального» пользователя от того, который аутентифицирован с помощью httpBasic ()

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

С помощью ввода @ kj007 я смог заставить это работать.Я использую requireCsrfProtectionMatcher, и вот как выглядит мой сопоставитель:

public class UIRequestMatcher implements RequestMatcher {

    public static final List<GrantedAuthority> USER_ROLES = new ArrayList<>();
    static {
        USER_ROLES.add(new SimpleGrantedAuthority(SecurityConfiguration.ROLE_ADMIN));
        USER_ROLES.add(new SimpleGrantedAuthority(SecurityConfiguration.ROLE_FILES_AUTHOR));
        USER_ROLES.add(new SimpleGrantedAuthority(SecurityConfiguration.ROLE_FORMS_AUTHOR));
        USER_ROLES.add(new SimpleGrantedAuthority(SecurityConfiguration.ROLE_TEMPLATES_AUTHOR));
    }

    @Override
    public boolean matches(HttpServletRequest request) {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        return "POST".equals(request.getMethod()) && auth.getAuthorities().stream().anyMatch(USER_ROLES::contains);
    }

}

Поэтому я проверяю, имеет ли Authentication какую-либо из моих пользовательских ролей, поскольку мой базовый auth должен использоваться только длямои технические пользователи.

0 голосов
/ 19 октября 2018

В вашем Java-файле конфигурации Spring Security вы можете настроить объект HttpSecurity следующим образом, чтобы включить проверку CSRF только для некоторых запросов (по умолчанию включена для всех входящих запросов, а отключение отключит для всехвходящий запрос, поэтому запрос Mather может помочь здесь для пути, который вы хотите включить или отключить csrf.).

Обязательно замените /urls-with-csrf-check/** вашими путями в конечной точке или несколькими путями ..

 @Override
    protected void configure(HttpSecurity http) throws Exception {

        RequestMatcher csrfRequestMatcher = new RequestMatcher() {
            private RegexRequestMatcher requestMatcher =
                    new RegexRequestMatcher("/urls-with-csrf-check/**", null);

            public boolean matches(HttpServletRequest httpServletRequest) {
                if (requestMatcher.matches(httpServletRequest)) {
                    return true;
                }
                return false;
            }
        };

        http.requestMatchers().antMatchers("/form/fill", "/form/fill/*", "/form/fillParams", "/form/fillParams/*").and()
                .csrf()
                .requireCsrfProtectionMatcher(csrfRequestMatcher)
                .and()
                .authorizeRequests().anyRequest().hasAnyRole(SecurityConfiguration.ROLE_FORMS_AUTHOR, SecurityConfiguration.ROLE_FORM_FILLER, SecurityConfiguration.ROLE_ADMIN)
                .and().httpBasic();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...