В чем разница между этими двумя методами?

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

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

В весеннем классе конфигурации безопасности, когда я использую HttpSecurity, он по-прежнему дает мне 403 запрещенных, но когда я использую WebSecurity, он проходит нормально? Это почему? Я чувствую, что едва контролирую, что разрешено и что нужно авторизовать через фильтр.

5
D.Tomov 12 Апр 2019 в 16:04

2 ответа

Лучший ответ

Я предлагаю вам просмотреть эту статью: Spring Security Java Config Preview: веб-безопасность Отличия двух подходов от ваших кодов:

  • HttpSecurity позволяет настроить веб-безопасность для HTTP-запросов. На этом уровне вы объявляете правила аутентификации.
  • WebSecurity позволяет настраивать вещи, которые оказывают глобальное влияние на всю веб-безопасность, например настраивать режим отладки или разрешать дальнейшую настройку брандмауэра с использованием реализации HttpFirewall или просто игнорируя ресурсы, как показывает ваш код.

Возможно, вас заинтересует третий configure метода AuthenticationManagerBuilder, который включает и обеспечивает механизм аутентификации, такой как аутентификация на основе LDAP или JDBC.

3
Nikolas 12 Апр 2019 в 13:27

Это немного абстрактный вопрос, и есть немного абстрактный ответ.

  1. [flow 1] Представьте себе большое офисное здание, на первом этаже которого находится главный ресепшн, который на первом этаже можно пропустить в здание, и если вы хотите пойти в компанию, скажем, B они приведут вас туда, но они не могут впустить вас в офис любой компании, потому что они честны, и у каждого офиса есть свой прием и когда вы пришли в B

  2. [flow 2] Представьте также, что в том же большом офисном здании есть ресторан / магазин / туалет, когда вы приходите к главной стойке регистрации на первом этаже и спрашиваете, где находится ресторан, они приведут вы там, вы не должны проходить аутентификацию здесь, они понятия не имеют, кто вы, и они не должны: web.ignoring().antMatchers("/restaurant/**");

  3. [поток 3] Представьте, что в том же большом офисном здании есть компания C , которая решила открыть галерею на своем этаже (в одной комнате, а не во всем офисе).

    • они спросили у главной стойки регистрации на первом этаже, "если кто-нибудь придет посмотреть нашу галерею, просто впустите их без аутентификации на нашем приеме" web.ignoring().antMatchers("/C/gallery/**");
    • также они могут другим способом обработать поток 1 , и когда человек придет к их стойке регистрации и скажет, что хочет посмотреть их галерею, он просто впустит их без аутентификации {{X1} }

    В обоих случаях результат будет одинаковым, посетитель увидит галерею компании C , но в потоке http есть много шагов / персон / / фильтров в случае {{X1 }}) вовлечен - он немного медленнее и не требует статических ресурсов.

Главный прием на первом этаже, это - WebSecurity это только один во всем приложении / здании.

Прием любой компании это WebSecurityConfigurerAdapter (у каждого WebSecurityConfigurerAdapter есть только один HttpSecurity), вы можете иметь столько их, сколько пожелаете, и у каждого из них может быть полностью отдельный поток аутентификации, требования безопасности и т. Д. ..., но все они могут попросить WebSecurity предоставить доступ к некоторым ресурсам кому-либо без какой-либо аутентификации. WebSecurity даже не знает, как аутентифицировать пользователя - такой опции нет.

Подводя итог вашему вопросу, эти два подхода должны дать одинаковый эффект, если нет, это означает, что WebSecurityConfigurerAdapter имеет некоторую дополнительную конфигурацию (по умолчанию ex crsf и т. Д.), Которая также меняет поведение WebSecurityConfigurerAdapter по умолчанию имеет ExceptionTranslationFilter, который перехватывает исключения безопасности и возвращает соответствующий статус (401, 403). Чтобы дать вам лучший ответ, вы должны предоставить более подробную информацию. Создайте новый проект только с указанной конфигурацией, отключите http.csrf().disable().

0
Andrew Sasha 15 Апр 2019 в 07:59