HttpSecurity, WebSecurity та AuthenticationManagerBuilder


Відповіді:


125

configure (AuthenticationManagerBuilder) використовується для встановлення механізму аутентифікації, дозволяючи легко додавати AuthenticationProviders: наприклад, нижче визначається автентифікація в пам'яті за допомогою вбудованих логін користувача та адміністратора.

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) використовується для налаштувань конфігурації, що впливають на глобальну безпеку (ігноруйте ресурси, встановіть режим налагодження, відхиляйте запити, застосовуючи спеціальне визначення брандмауера). Наприклад, наступний метод спричинить ігнорування будь-якого запиту, який починається з / ресурсів / для цілей аутентифікації.

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

Щоб отримати додаткову інформацію, перейдіть за наступним посиланням Spring Security: Попередній перегляд налаштування Java: Web Security


2
Гарна відповідь Нік. З Spring-security-config-5.0.3 (що постачається з Spring-boot 2.0.0) я не зміг знайти метод http.authorizeUrls(), можливо, його перейменовано на http.authorizeRequests()деякий час тому.
Yi Ou

5
Я знаю, що це старе, але яка найкраща практика тут? Я знайшов приклади реалізації параметрів налаштування (HttpSecurity http), що викликають http.antMatchers ("/ foo"). Дазвол () ", що здається еквівалентом виклику web.ignoring (). AntMatchers (" / foo ") у налаштуваннях (WebSecurity web) метод.
chrisinmtown

чудова відповідь. Мені цікаво, чи нам коли-небудь потрібно зателефонувати на дозвіл на HttpSecurity? Чи не можемо ми просто ігнорувати всі відкриті URL-адреси, як-от / зареєструватися чи / увійти за допомогою WebSecurity? Тоді чому всі підручники або відповіді використовують HttpSecurity.permitAll для / реєстрації та / входу, але WebSecurity.ingore для / publics / ресурсів? -
Mohd Waseem

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's .

@Override
     protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("user").password("password").roles("USER"); 
        auth.userDetailsService(customUserDetailService).passwordEncoder(new BCryptPasswordEncoder());
     }

чудова відповідь. Мені цікаво, чи нам коли-небудь потрібно зателефонувати на дозвіл на HttpSecurity? Чи не можемо ми просто ігнорувати всі відкриті URL-адреси, як-от / зареєструватися чи / увійти за допомогою WebSecurity? Тоді чому в усіх підручниках або відповідях використовується HttpSecurity.permitAll для / реєстрації та / входу, але WebSecurity.ingore для / publics / ресурсів?
Mohd Waseem
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.