Temukan Filter Keamanan Musim Semi Terdaftar

1. Ikhtisar

Keamanan Musim Semi didasarkan pada rantai filter servlet. Setiap filter memiliki tanggung jawab khusus dan tergantung pada konfigurasinya, filter ditambahkan atau dihapus.

Dalam tutorial ini, kita akan membahas berbagai cara untuk menemukan Filter Keamanan Musim Semi yang terdaftar .

2. Debugging Keamanan

Pertama, kami akan mengaktifkan debugging keamanan yang akan mencatat informasi keamanan terperinci pada setiap permintaan.

Kita bisa mengaktifkan security debugging menggunakan properti debug :

@EnableWebSecurity(debug = true)

Dengan cara ini, ketika kami mengirim permintaan ke server, semua informasi permintaan akan dicatat.

Kami juga dapat melihat seluruh rantai filter keamanan:

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

3. Penebangan

Selanjutnya, kami akan menemukan filter keamanan kami dengan mengaktifkan logging untuk FilterChainProxy .

Kita dapat mengaktifkan logging dengan menambahkan baris berikut ke application.properties :

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

Berikut log terkait:

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. Mendapatkan Filter secara Terprogram

Sekarang, kita akan melihat cara mendapatkan filter keamanan terdaftar secara terprogram.

Kami akan menggunakan FilterChainProxy untuk mendapatkan filter keamanan.

Pertama, mari lakukan autowire kacang springSecurityFilterChain :

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

Di sini, kami menggunakan @Qualifier dengan nama springSecurityFilterChain dengan tipe Filter, bukan FilterChainProxy. Ini karena metode springSecurityFilterChain () di WebSecurityConfiguration, yang membuat rantai filter Keamanan Musim Semi, mengembalikan jenis Filter dan bukan FilterChainProxy.

Selanjutnya, kita akan mentransmisikan objek ini ke FilterChainProxy dan memanggil metode 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 keluarannya:

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 bahwa sejak Spring Security 3.1, FilterChainProxy dikonfigurasi menggunakan daftar SecurityFilterChain. Namun, sebagian besar aplikasi hanya memerlukan satu SecurityFilterChain.

5. Filter Keamanan Musim Semi yang Penting

Terakhir, mari kita lihat beberapa filter keamanan penting:

  • UsernamePasswordAuthenticationFilter : proses otentikasi, merespon secara default ke "/ login" URL
  • AnonymousAuthenticationFilter : ketika tidak ada objek otentikasi di SecurityContextHolder, itu membuat objek otentikasi anonim dan meletakkannya di sana
  • FilterSecurityInterceptor: meningkatkan pengecualian saat akses ditolak
  • ExceptionTranslationFilter : menangkap pengecualian Keamanan Musim Semi

6. Kesimpulan

Dalam artikel singkat ini, kami menjelajahi cara menemukan filter Keamanan Musim Semi terdaftar secara terprogram dan menggunakan log.

Seperti biasa, kode sumber dapat ditemukan di GitHub.