Finn de registrerte vårsikkerhetsfiltrene

1. Oversikt

Spring Security er basert på en kjede av servletfiltre. Hvert filter har et bestemt ansvar, og avhengig av konfigurasjonen blir filtre lagt til eller fjernet.

I denne veiledningen, vi diskuterer forskjellige måter å finne de registrerte Spring Security Filters på.

2. Sikkerhetsfeilsøking

Først vil vi aktivere sikkerhetsfeilsøking som vil logge detaljert sikkerhetsinformasjon på hver forespørsel.

Vi kan aktivere feilsøking ved hjelp av feilsøke eiendom:

@EnableWebSecurity (feilsøking = sant)

Når vi sender en forespørsel til serveren, logges all forespørselsinformasjonen.

Vi vil også kunne se hele sikkerhetsfilterkjeden:

Sikkerhetsfilterkjede: [WebAsyncManagerIntegrationFilter SecurityContextPersistenceFilter HeaderWriterFilter LogoutFilter UsernamePasswordAuthenticationFilter // ...]

3. Logging

Deretter finner vi sikkerhetsfiltrene våre ved å aktivere loggingen for FilterChainProxy.

Vi kan aktivere logging ved å legge til følgende linje i application.properties:

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

Her er den relaterte loggen:

DEBUG o.s.security.web.FilterChainProxy - / foos / 1 i posisjon 1 av 12 i ytterligere filterkjede; avfyringsfilter: 'WebAsyncManagerIntegrationFilter' DEBUG o.s.security.web.FilterChainProxy - / foos / 1 i posisjon 2 av 12 i ytterligere filterkjede; avfyringsfilter: 'SecurityContextPersistenceFilter' DEBUG o.s.security.web.FilterChainProxy - / foos / 1 i posisjon 3 av 12 i ytterligere filterkjede; avfyringsfilter: 'HeaderWriterFilter' DEBUG o.s.security.web.FilterChainProxy - / foos / 1 i posisjon 4 av 12 i ytterligere filterkjede; avfyringsfilter: 'LogoutFilter' DEBUG o.s.security.web.FilterChainProxy - / foos / 1 i posisjon 5 av 12 i ytterligere filterkjede; avfyringsfilter: 'UsernamePasswordAuthenticationFilter' ...

4. Skaffe filtrene programmatisk

Nå får vi se hvordan du får tak i de registrerte sikkerhetsfiltrene programmatisk.

Vi bruker FilterChainProxy for å få sikkerhetsfiltrene.

La oss først koble til springSecurityFilterChain bønne:

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

Her brukte vi en @Kvalifiserende med navnet springSecurityFilterChain med type Filter i stedet for FilterChainProxy. Dette er fordi metoden for springSecurityFilterChain () i WebSecurityConfiguration, som skaper Spring Security filterkjede, returtype Filter og ikke FilterChainProxy.

Deretter kaster vi dette objektet til FilterChainProxy og ring getFilterChains () metode:

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

Og her er en prøveutgang:

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

Merk at siden vårsikkerhet 3.1, FilterChainProxy konfigureres ved hjelp av en liste over SecurityFilterChain. Imidlertid trenger de fleste applikasjoner bare en SecurityFilterChain.

5. Viktige vårsikkerhetsfiltre

Til slutt, la oss ta en titt på noen av de viktige sikkerhetsfiltrene:

  • BrukernavnPassordAuthenticationFilter: prosessgodkjenning, svarer som standard på “/ login” URL
  • AnonymAuthenticationFilter: når det ikke er noe autentiseringsobjekt i SecurityContextHolder, oppretter det et anonymt autentiseringsobjekt og legger det der
  • FilterSecurityInterceptor: heve unntak når tilgang nektes
  • UnntakTranslationFilter: få unntak fra vårsikkerhet

6. Konklusjon

I disse raske artiklene utforsket vi hvordan vi finner registrerte Spring Security-filtre programmatisk og ved hjelp av logger.

Som alltid kan kildekoden bli funnet på GitHub.