HttpSecurity, WebSecurity, dan AuthenticationManagerBuilder

100

Adakah yang bisa menjelaskan kapan harus mengganti configure(HttpSecurity), configure(WebSecurity)dan configure(AuthenticationManagerBuilder)?

pengguna3488241
sumber

Jawaban:

125

konfigurasi (AuthenticationManagerBuilder) digunakan untuk membuat mekanisme otentikasi dengan mengizinkan AuthenticationProviders ditambahkan dengan mudah: misalnya, berikut ini mendefinisikan otentikasi dalam memori dengan login 'pengguna' dan 'admin' yang ada di dalamnya.

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

konfigurasi (HttpSecurity) memungkinkan konfigurasi keamanan berbasis web pada tingkat sumber daya, berdasarkan kecocokan pilihan - misalnya Contoh di bawah ini membatasi URL yang dimulai dengan / admin / untuk pengguna yang memiliki peran ADMIN, dan menyatakan bahwa URL lain harus berhasil diautentikasi.

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

mengkonfigurasi (WebSecurity) digunakan untuk pengaturan konfigurasi yang mempengaruhi keamanan global (mengabaikan sumber daya, mengatur mode debug, menolak permintaan dengan menerapkan definisi firewall kustom). Misalnya, metode berikut akan menyebabkan permintaan apa pun yang dimulai dengan / resources / diabaikan untuk tujuan otentikasi.

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

Anda dapat merujuk ke link berikut untuk informasi lebih lanjut Spring Security Java Config Preview: Web Security

Nick Vasic
sumber
2
Jawaban bagus Nick. Dengan spring-security-config-5.0.3 (yang hadir dengan spring-boot 2.0.0), saya tidak dapat menemukan metodenya http.authorizeUrls(), mungkin telah diubah namanya menjadi http.authorizeRequests()beberapa waktu yang lalu.
Yi Ou
5
Saya tahu ini sudah tua, tapi apa praktik terbaik di sini? Saya telah menemukan contoh implementasi metode konfigurasi (HttpSecurity http) yang memanggil http.antMatchers ("/ foo"). PermitAll () "yang tampaknya setara dengan menjalankan web.ignoring (). AntMatchers (" / foo ") di konfigurasi (WebSecurity web) metode.
chrisinmtown
jawaban yang bagus. Saya ingin tahu apakah kita perlu memanggil permitAll di HttpSecurity? Tidak bisakah kita mengabaikan semua url yang terbuka seperti / register atau / login menggunakan WebSecurity? Lalu mengapa semua tutorial atau jawaban menggunakan HttpSecurity.permitAll untuk / register dan / login tetapi WebSecurity.ingore untuk / publics of / resources? -
Mohd Waseem
3

Penggunaan umum ignoring()metode WebSecurity menghilangkan Spring Security dan tidak ada fitur Spring Security yang akan tersedia. WebSecurity didasarkan di atas 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 dalam contoh di atas memungkinkan Spring mengabaikan /resources/**dan /publics/**. Oleh karena itu .antMatchers("/publics/**").hasRole("USER")di HttpSecurity adalah unconsidered .

Ini akan menghilangkan pola permintaan dari rantai filter keamanan sepenuhnya. Perhatikan bahwa apa pun yang cocok dengan jalur ini kemudian tidak akan memiliki layanan otentikasi atau otorisasi yang diterapkan dan akan dapat diakses secara bebas.

configure(HttpSecurity)memungkinkan konfigurasi keamanan berbasis web pada tingkat sumber daya , berdasarkan kecocokan pilihan - mis. Contoh di bawah ini membatasi URL yang dimulai dengan /admin/pengguna yang memiliki peran ADMIN , dan menyatakan bahwa URL lain harus berhasil diautentikasi.

configure(WebSecurity)digunakan untuk setelan konfigurasi yang memengaruhi keamanan global (abaikan sumber daya, setel mode debug, tolak permintaan dengan menerapkan definisi firewall khusus). Sebagai contoh, metode berikut ini akan menyebabkan permintaan yang dimulai dengan /resources/harus diabaikan untuk otentikasi tujuan.

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

SecurityBuilder digunakan untuk membuat file AuthenticationManager. Memungkinkan untuk dengan mudah membangun otentikasi memori, otentikasi LDAP, otentikasi berbasis JDBC, menambahkan UserDetailsService, dan menambahkan AuthenticationProvider .

@Override
     protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("user").password("password").roles("USER"); 
        auth.userDetailsService(customUserDetailService).passwordEncoder(new BCryptPasswordEncoder());
     }
Patel Romil
sumber
jawaban yang bagus. Saya ingin tahu apakah kita perlu memanggil permitAll di HttpSecurity? Tidak bisakah kita mengabaikan semua url yang terbuka seperti / register atau / login menggunakan WebSecurity? Lalu mengapa semua tutorial atau jawaban menggunakan HttpSecurity.permitAll untuk / register dan / login tetapi WebSecurity.ingore untuk / publics of / resources?
Mohd Waseem