HttpSecurity, WebSecurity и AuthenticationManagerBuilder

101

Может кто - нибудь объяснить , когда переопределить configure(HttpSecurity), configure(WebSecurity)а configure(AuthenticationManagerBuilder)?

user3488241
источник

Ответы:

125

configure (AuthenticationManagerBuilder) используется для установки механизма аутентификации, позволяя легко добавлять AuthenticationProvider: например, следующее определяет аутентификацию в памяти со встроенными логинами «пользователь» и «администратор».

public void configure(AuthenticationManagerBuilder auth) {
    auth
        .inMemoryAuthentication()
        .withUser("user")
        .password("password")
        .roles("USER")
    .and()
        .withUser("admin")
        .password("password")
        .roles("ADMIN","USER");
}

configure (HttpSecurity) позволяет настраивать веб-безопасность на уровне ресурсов на основе совпадения выбора - например, приведенный ниже пример ограничивает URL-адреса, начинающиеся с / admin /, для пользователей с ролью ADMIN, и объявляет, что любые другие URL-адреса должны быть успешно аутентифицирован.

protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
        .antMatchers("/admin/**").hasRole("ADMIN")
        .anyRequest().authenticated()
}

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

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

Вы можете обратиться к следующей ссылке для получения дополнительной информации Spring Security Java Config Preview: Web Security

Ник Васич
источник
2
Хороший ответ, Ник. С spring-security-config-5.0.3 (который поставляется с spring-boot 2.0.0) мне не удалось найти метод http.authorizeUrls(), возможно, он был переименован http.authorizeRequests()некоторое время назад.
Yi Ou
5
Я знаю, что это старый, но что здесь лучше всего? Я нашел примеры реализаций метода configure (HttpSecurity http), вызывающих http.antMatchers ("/ foo"). AllowAll () ", что кажется эквивалентным вызову web.ignoring (). AntMatchers (" / foo ") в configure (WebSecurity web)
chrisinmtown
отличный ответ. Мне интересно, понадобится ли нам когда-нибудь вызывать разрешениеAll на HttpSecurity? Разве мы не можем просто игнорировать все открытые URL-адреса, такие как / register или / login, используя WebSecurity? Тогда почему все учебники или ответы используют HttpSecurity.permitAll для / register и / login, но WebSecurity.ingore для / publics of / resources? -
Мохд Васим
3

Общее использование ignoring()метода WebSecurity не включает 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 является непродуманным .

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

configure(HttpSecurity)позволяет настроить веб-безопасность на уровне ресурсов на основе совпадения выбора - например, в приведенном ниже примере ограничиваются URL-адреса, которые начинаются с /admin/пользователей с ролью ADMIN , и объявляется, что любые другие URL-адреса должны быть успешно аутентифицированы.

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

AuthenticationManagerBuilder
extends AbstractConfiguredSecurityBuilder<AuthenticationManager,AuthenticationManagerBuilder>
implements ProviderManagerBuilder<AuthenticationManagerBuilder>

SecurityBuilder используется для создания файла AuthenticationManager. Позволяет легко встроить аутентификацию памяти, аутентификацию LDAP, аутентификацию на основе JDBC, добавить UserDetailsService и добавить AuthenticationProvider .

@Override
     protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("user").password("password").roles("USER"); 
        auth.userDetailsService(customUserDetailService).passwordEncoder(new BCryptPasswordEncoder());
     }
Патель Ромил
источник
отличный ответ. Мне интересно, понадобится ли нам когда-нибудь вызывать разрешениеAll на HttpSecurity? Разве мы не можем просто игнорировать все открытые URL-адреса, такие как / register или / login, используя WebSecurity? Тогда почему все учебники или ответы используют HttpSecurity.permitAll для / register и / login, но WebSecurity.ingore для / publics of / resources?
Мохд Васим,