Конфигурация безопасности Spring — HttpSecurity против WebSecurity

Мне просто нужно кое-что понять в конфигурации безопасности Spring. Используя приведенный ниже пример...

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .httpBasic()
            .and()
            .authorizeRequests().antMatchers("/secret/**").authenticated()
            .and()
            .authorizeRequests().antMatchers("/**").permitAll();
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/resources/**");
    }

}

Какова цель метода configure(WebSecurity web)?

Нельзя ли просто добавить /resources/** в метод configure(HttpSecurity http) в этой строке .authorizeRequests().antMatchers("/**", "/resources/**").permitAll(); Разве это не должно работать так же, то есть разрешать все запросы к /resources/** без какой-либо аутентификации?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
53
0
19 218
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

configure(HttpSecurity): позволяет настроить веб-безопасность для определенных HTTP-запросов. Он используется для настройки веб-безопасности на уровне ресурсов на основе совпадения выбора.

configure (WebSecurity): позволяет добавлять экземпляры RequestMatcher, которые Spring Security должен игнорировать.

Когда вы используете HttpSecurity и пытаетесь выполнить permitAll() запросы. Доступ к вашим запросам будет разрешен из Spring Security Filter Chain. Это затратно, так как будут запросы других запросов, которые также будут поступать в эту цепочку фильтров, которые необходимо разрешить или запретить на основе аутентификации/авторизации.

HttpSecurity.authorizeRequests().antMatchers("/**", "/resources/**").permitAll();

Но когда вы используете, любые запросы к resources будут полностью проходить цепочку фильтров безопасности Spring. Это безопасно, потому что вам не нужна аутентификация/авторизация, чтобы увидеть изображение или прочитать файл javascript.

WebSecurity.ignoring().antMatchers("/resources/**");
Ответ принят как подходящий

Общее использование метода WebSecurity ignoring()опускает Spring Security и ни одна из функций Spring Security не будет доступна. WebSecurity основан на HttpSecurity.

@Override
public void configure(WebSecurity web) throws Exception {
    web
        .ignoring()
        .antMatchers("/resources/**")
        .antMatchers("/publics/**");
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
        .antMatchers("/admin/**").hasRole("ADMIN")
        .antMatchers("/publics/**").hasRole("USER") // no effect
        .anyRequest().authenticated();
}

WebSecurity в приведенном выше примере позволяет Spring игнорировать /resources/** и /publics/**. Поэтому .antMatchers("/publics/**").hasRole("USER") в HttpSecurity — это необдуманный.

This will omit the request pattern from the security filter chain entirely. Note that anything matching this path will then have no authentication or authorization services applied and will be freely accessible.

configure(HttpSecurity) позволяет настроить веб-безопасность в уровень ресурсов на основе совпадения выбора, например. В приведенном ниже примере URL-адреса, начинающиеся с /admin/, ограничены пользователями с Роль АДМИНИСТРАТОРА и объявлены, что любые другие URL-адреса должны быть успешно аутентифицирован..

configure(WebSecurity) используется для параметров конфигурации, которые повлиять на глобальную безопасность (игнорирование ресурсов, установка режима отладки, отклонение запросов путем реализации пользовательского определения брандмауэра). Например, следующий метод приведет к тому, что любой запрос, начинающийся с /resources/, будет игнорируется для аутентификации.


Давайте рассмотрим приведенный ниже код, мы можем игнорировать аутентификацию для конечной точки, предоставленную в antMatchers, используя оба метода.

@Override
public void configure(WebSecurity web) throws Exception {
    web
        .ignoring()
        .antMatchers("/login", "/register", "/api/public/**");
}

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

    http
        .csrf().disable()
        .authorizeRequests()
        .antMatchers("/login", "/register", "/api/public/**").permitAll()
        .anyRequest().authenticated();
}
  • configure(WebSecurity web) Конечная точка, используемая в этом методе, игнорирует фильтры безопасности spring, функции безопасности (безопасные заголовки, защита csrf и т. д.) также игнорируются, контекст безопасности не устанавливается и не может защитить конечные точки от межсайтового скриптинга, атак XSS, прослушивания контента.

  • configure(HttpSecurity http) Конечная точка, используемая в этом методе, игнорирует аутентификацию для конечных точек, используемых в antMatchers, и будут действовать другие функции безопасности, такие как безопасные заголовки, защита CSRF и т. д.

В вашем втором примере это тот случай, когда configure(HttpSecurity http) полностью игнорируется, потому что configure(WebSecurity web) уже говорит, что все те же конечные точки следует игнорировать?

Robert Mark Bram 30.04.2021 08:00

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