Cari Penapis Keselamatan Musim Semi Berdaftar

1. Gambaran keseluruhan

Spring Security didasarkan pada rangkaian penapis servlet. Setiap penapis mempunyai tanggungjawab tertentu dan bergantung pada konfigurasi, penapis ditambahkan atau dikeluarkan.

Dalam tutorial ini, kita akan membincangkan pelbagai cara untuk mencari Penapis Keselamatan Musim Semi yang didaftarkan .

2. Penyahpepijatan Keselamatan

Pertama, kami akan mengaktifkan debug keselamatan yang akan mencatat maklumat keselamatan terperinci pada setiap permintaan.

Kami boleh mengaktifkan debug keselamatan menggunakan harta debug :

@EnableWebSecurity(debug = true)

Dengan cara ini, ketika kita mengirim permintaan ke pelayan, semua maklumat permintaan akan dicatat.

Kami juga dapat melihat keseluruhan rantai penapis keselamatan:

Security filter chain: [ WebAsyncManagerIntegrationFilter SecurityContextPersistenceFilter HeaderWriterFilter LogoutFilter UsernamePasswordAuthenticationFilter // ... ]

3. Pembalakan

Seterusnya, kami akan mencari penapis keselamatan kami dengan mengaktifkan penebangan untuk FilterChainProxy .

Kita boleh mengaktifkan pembalakan dengan menambahkan baris berikut ke application.properties :

logging.level.org.springframework.security.web.FilterChainProxy=DEBUG

Inilah log yang berkaitan:

DEBUG o.s.security.web.FilterChainProxy - /foos/1 at position 1 of 12 in additional filter chain; firing Filter: 'WebAsyncManagerIntegrationFilter' DEBUG o.s.security.web.FilterChainProxy - /foos/1 at position 2 of 12 in additional filter chain; firing Filter: 'SecurityContextPersistenceFilter' DEBUG o.s.security.web.FilterChainProxy - /foos/1 at position 3 of 12 in additional filter chain; firing Filter: 'HeaderWriterFilter' DEBUG o.s.security.web.FilterChainProxy - /foos/1 at position 4 of 12 in additional filter chain; firing Filter: 'LogoutFilter' DEBUG o.s.security.web.FilterChainProxy - /foos/1 at position 5 of 12 in additional filter chain; firing Filter: 'UsernamePasswordAuthenticationFilter' ...

4. Memperoleh Penapis Secara Berprogram

Sekarang, kita akan melihat cara mendapatkan penapis keselamatan yang didaftarkan secara terprogram.

Kami akan menggunakan FilterChainProxy untuk mendapatkan penapis keselamatan.

Mula-mula, mari kita automatikkan springSecurityFilterChain bean:

@Autowired @Qualifier("springSecurityFilterChain") private Filter springSecurityFilterChain;

Di sini, kami menggunakan @Qualifier dengan nama springSecurityFilterChain dengan jenis Filter dan bukannya FilterChainProxy. Ini kerana kaedah springSecurityFilterChain () dalam WebSecurityConfiguration, yang membuat rantai penapis Spring Security, jenis kembali Filter dan bukan FilterChainProxy.

Seterusnya, kami akan menghantar objek ini ke FilterChainProxy dan memanggil kaedah getFilterChains () :

public void getFilters() { FilterChainProxy filterChainProxy = (FilterChainProxy) springSecurityFilterChain; List list = filterChainProxy.getFilterChains(); list.stream() .flatMap(chain -> chain.getFilters().stream()) .forEach(filter -> System.out.println(filter.getClass())); }

Dan inilah contoh output:

class org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter class org.springframework.security.web.context.SecurityContextPersistenceFilter class org.springframework.security.web.header.HeaderWriterFilter class org.springframework.security.web.authentication.logout.LogoutFilter class org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter ...

Perhatikan bahawa sejak Spring Security 3.1, FilterChainProxy dikonfigurasikan menggunakan senarai SecurityFilterChain. Walau bagaimanapun, kebanyakan aplikasi hanya memerlukan satu SecurityFilterChain.

5. Penapis Keselamatan Musim Semi Penting

Akhirnya, mari kita lihat beberapa penapis keselamatan penting:

  • UsernamePasswordAuthenticationFilter : proses pengesahan, bertindak balas secara lalai ke URL "/ login"
  • AnonymousAuthenticationFilter : apabila tidak ada objek pengesahan di SecurityContextHolder, ia membuat objek pengesahan tanpa nama dan meletakkannya di sana
  • FilterSecurityInterceptor: tingkatkan pengecualian apabila akses ditolak
  • ExceptionTranslationFilter : menangkap pengecualian Spring Security

6. Kesimpulannya

Dalam artikel ringkas ini, kami meneroka cara mencari penapis Spring Security yang didaftarkan secara terprogram dan menggunakan log.

Seperti biasa, kod sumber boleh didapati di GitHub.