Spring Boot Security Auto-Configuration

1. Introduktion

I denne artikel vil vi se på Spring Boots meningsfulde tilgang til sikkerhed.

Kort sagt, vi vil fokusere på standardsikkerhedskonfigurationen, og hvordan vi kan deaktivere eller tilpasse den, hvis vi har brug for det.

2. Standard sikkerhedsopsætning

For at tilføje sikkerhed til vores Spring Boot-applikation skal vi tilføje afhængighed af sikkerhedsstarter:

 org.springframework.boot spring-boot-starter-security 

Dette vil omfatte SecurityAutoConfiguration klasse - der indeholder den indledende / standard sikkerhedskonfiguration.

Læg mærke til, hvordan vi ikke specificerede versionen her med den antagelse, at projektet allerede bruger Boot som forælder.

Kort fortalt, Som standard bliver godkendelsen aktiveret for applikationen. Også indholdsforhandling bruges til at afgøre, om basic eller formLogin skal bruges.

Der er nogle foruddefinerede egenskaber, såsom:

spring.security.user.name spring.security.user.password

Hvis vi ikke konfigurerer adgangskoden ved hjælp af den foruddefinerede egenskab spring.security.user.password og start applikationen, bemærker vi, at en standardadgangskode genereres tilfældigt og udskrives i konsolloggen:

Brug af standard sikkerhedsadgangskode: c8be15de-4488-4490-9dc6-fab3f91435c6

For flere standardindstillinger, se afsnittet om sikkerhedsegenskaber på siden Referencegenskaber for almindelige applikationsegenskaber.

3. Deaktivering af autokonfiguration

For at kassere den automatiske sikkerhedskonfiguration og tilføje vores egen konfiguration skal vi udelukke SecurityAutoConfiguration klasse.

Dette kan gøres via en simpel udelukkelse:

@SpringBootApplication (ekskluder = {SecurityAutoConfiguration.class}) offentlig klasse SpringBootSecurityApplication {public static void main (String [] args) {SpringApplication.run (SpringBootSecurityApplication.class, args); }} 

Eller ved at tilføje nogle konfigurationer i application.properties fil:

spring.autoconfigure.exclude = org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration

Der er også nogle særlige tilfælde, hvor denne opsætning ikke er helt nok.

For eksempel startes næsten hver Spring Boot-applikation med aktuator i klassestien. Dette skaber problemer, fordi en anden automatisk konfigurationsklasse har brug for den, vi lige har ekskluderet, så applikationen starter ikke.

For at løse dette problem er vi nødt til at ekskludere denne klasse; og specifikt for aktuatorsituationen er vi nødt til at udelukke ManagementWebSecurityAutoConfiguration.

3.1. Deaktivering versus overskridelse af automatisk konfiguration af sikkerhed

Der er en signifikant forskel mellem at deaktivere autokonfiguration og at overgå den.

Ved at deaktivere det er det ligesom at tilføje Spring Security-afhængighed og hele opsætningen fra bunden. Dette kan være nyttigt i flere tilfælde:

  1. Integrering af applikationssikkerhed med en brugerdefineret sikkerhedsudbyder
  2. Migrering af en ældre Spring-applikation med allerede eksisterende sikkerhedsopsætning - til Spring Boot

Men det meste af tiden behøver vi ikke fuldt ud at deaktivere den automatiske sikkerhedskonfiguration.

Den måde, som Spring Boot er konfigureret på, tillader at overgå den autokonfigurerede sikkerhed ved at tilføje i vores nye / brugerdefinerede konfigurationsklasser. Dette er typisk lettere, da vi bare tilpasser en eksisterende sikkerhedsopsætning for at opfylde vores behov.

4. Konfiguration af Spring Boot Security

Hvis vi har valgt stien til deaktivering af automatisk konfiguration af sikkerhed, er vi naturligvis nødt til at give vores egen konfiguration.

Som vi har diskuteret før, er dette standardsikkerhedskonfigurationen; vi kan tilpasse det ved at ændre ejendomsfilen.

Vi kan for eksempel tilsidesætte standardadgangskoden ved at tilføje vores eget:

spring.security.user.password = adgangskode

Hvis vi ønsker en mere fleksibel konfiguration, f.eks. Med flere brugere og roller, skal vi bruge en fuld @Konfiguration klasse:

@Configuration @EnableWebSecurity offentlig klasse BasicConfiguration udvider WebSecurityConfigurerAdapter {@Override beskyttet ugyldig konfiguration (AuthenticationManagerBuilder auth) kaster Undtagelse {PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder (); auth .inMemoryAuthentication () .withUser ("user") .password (encoder.encode ("password")) .roles ("USER"). and () .withUser ("admin") .password (encoder.encode (" admin ")) .roles (" BRUGER "," ADMIN "); } @ Override beskyttet ugyldig konfiguration (HttpSecurity http) kaster undtagelse {http .authorizeRequests () .anyRequest () .authenticated () .and () .httpBasic (); }}

Det @EnableWebSecurity annotering er afgørende, hvis vi deaktiverer standardsikkerhedskonfigurationen.

Hvis den mangler, starter applikationen ikke. Annotationen er kun valgfri, hvis vi bare tilsidesætter standardadfærden ved hjælp af en WebSecurityConfigurerAdapter.

Bemærk også, at vi brug for at bruge PasswordEncoder for at indstille adgangskoder, når du bruger Spring Boot 2. For flere detaljer, se vores vejledning om standardadgangskodekoderen i Spring Security 5.

Nu skal vi kontrollere, at vores sikkerhedskonfiguration gælder korrekt med et par hurtige live-tests:

@RunWith (SpringRunner.class) @SpringBootTest (webEnvironment = RANDOM_PORT) offentlig klasse BasicConfigurationIntegrationTest {TestRestTemplate restTemplate; URL-base; @LocalServerPort int-port; @Før offentlig ugyldig setUp () kaster FejlformetURLException {restTemplate = ny TestRestTemplate ("bruger", "adgangskode"); base = ny URL ("// localhost:" + port); } @Test offentlig ugyldig nårLoggedUserRequestsHomePage_ThenSuccess () kaster IllegalStateException, IOException {ResponseEntity respons = restTemplate.getForEntity (base.toString (), String.class); assertEquals (HttpStatus.OK, response.getStatusCode ()); assertTrue (respons.getBody (). indeholder ("Baeldung")); } @Test offentlig ugyldigt nårUserWithWrongCredentials_thenUnauthorizedPage () kaster undtagelse {restTemplate = ny TestRestTemplate ("bruger", "forkert adgangskode"); ResponseEntity respons = restTemplate.getForEntity (base.toString (), String.class); assertEquals (HttpStatus.UNAUTHORIZED, respons.getStatusCode ()); assertTrue (respons.getBody (). indeholder ("Uautoriseret")); }}

Ideen er, at bag Spring Boot Security faktisk er Spring Security, så enhver sikkerhedskonfiguration, der kan udføres med denne eller enhver integration, som denne understøtter, kan også implementeres i Spring Boot.

5. Spring Boot OAuth2 Auto-Configuration (ved hjælp af legacy stack)

Spring Boot har en dedikeret auto-konfigurationsunderstøttelse til OAuth2.

Spring Security OAuth-support, der fulgte med Spring Boot 1.x, blev fjernet i senere bootversioner i stedet for førsteklasses OAuth-support, der følger med Spring Security 5. Vi ser, hvordan man bruger det i næste afsnit.

For den ældre stak (ved hjælp af Spring Security OAuth) skal vi først tilføje en Maven-afhængighed for at starte opsætningen af ​​vores applikation:

 org.springframework.security.oauth fjeder-sikkerhed-oauth2 

Denne afhængighed inkluderer et sæt klasser, der er i stand til at udløse den automatiske konfigurationsmekanisme, der er defineret i OAuth2AutoConfiguration klasse.

Nu har vi flere valg at fortsætte, afhængigt af omfanget af vores ansøgning.

5.1. OAuth2 autorisationsserver automatisk konfiguration

Hvis vi ønsker, at vores ansøgning skal være en OAuth2-udbyder, kan vi bruge det @EnableAuthorizationServer.

Ved opstart bemærker vi i logfilerne, at de automatiske konfigurationsklasser genererer et klient-id og en klienthemmelighed til vores autorisationsserver og selvfølgelig en tilfældig adgangskode til grundlæggende godkendelse.

Brug af standard sikkerhedsadgangskode: a81cb256-f243-40c0-a585-81ce1b952a98 security.oauth2.client.client-id = 39d2835b-1f87-4a77-9798-e2975f36972e security.oauth2.client.client-secret = f1463f8b-0791-46fe -521b86c55b71

Disse legitimationsoplysninger kan bruges til at opnå et adgangstoken:

krølle -X POST -u 39d2835b-1f87-4a77-9798-e2975f36972e: f1463f8b-0791-46fe-9269-521b86c55b71 \ -d grant_type = client_credentials -d brugernavn = bruger -d adgangskode = a81cb256-f243-40a01 -d scope = skriv // localhost: 8080 / oauth / token

Vores anden artikel indeholder yderligere detaljer om emnet.

5.2. Andre Spring Boot OAuth2 Auto-konfigurationsindstillinger

Der er nogle andre brugssager, der er dækket af Spring Boot OAuth2 som:

  1. Ressource server - @EnableResourceServer
  2. Klientapplikation - @ EnableOAuth2Sso eller @ AktiverOAuth2Client

Hvis vi har brug for, at vores applikation er en af ​​de ovennævnte typer, er vi bare nødt til at tilføje nogle konfigurationer til applikationsegenskaber, som beskrevet af linkene der er henvist til ovenfor.

Alle OAuth2-specifikke egenskaber kan findes på Spring Boot Common Application Properties.

6. Spring Boot OAuth2 Auto-Configuration (ved hjælp af ny stak)

For at bruge den nye stak er vi nødt til at tilføje afhængigheder baseret på det, vi vil konfigurere - en autorisationsserver, en ressursserver eller en klientapplikation.

Lad os se på dem en efter en.

6.1. OAuth2 autorisationsserversupport

Som vi så i det forrige afsnit, tilbød Spring Security OAuth-stakken muligheden for at oprette en autorisationsserver som en Spring Application. Men projektet er udfaset, og Spring understøtter ikke sin egen autorisationsserver lige nu. I stedet anbefales det at bruge eksisterende veletablerede udbydere som Okta, Keycloak og Forgerock.

Spring Boot gør det dog let for os at konfigurere sådanne udbydere. For et eksempel på Keycloak-konfiguration kan vi henvise til enten En hurtig guide til brug af Keycloak med Spring Boot eller Keycloak Integreret i en Spring Boot-applikation.

6.2. OAuth2 Resource Server Support

For at inkludere support til en ressource server skal vi tilføje denne afhængighed:

 org.springframework.boot spring-boot-starter-oauth2-resource-server 

For at få den seneste version, gå over til Maven Central.

Derudover skal vi i vores sikkerhedskonfiguration medtage oauth2ResourceServer () DSL:

@Configuration offentlig klasse JWTSecurityConfig udvider WebSecurityConfigurerAdapter {@ Override-beskyttet ugyldig konfiguration (HttpSecurity http) kaster undtagelse {http ... .oauth2ResourceServer (oauth2 -> oauth2.jwt ()); ...}}

Vores OAuth 2.0 Resource Server With Spring Security 5 giver et dybtgående overblik over dette emne.

6.3. OAuth2 klientsupport

På samme måde som hvordan vi konfigurerede en ressource-server, har en klientapplikation også brug for sine egne afhængigheder og DSL'er.

Her er den specifikke afhængighed af OAuth2-klientsupport:

 org.springframework.boot spring-boot-starter-oauth2-client 

Den seneste version kan findes på Maven Central.

Spring Security 5 giver også førsteklasses login support via sin oath2Login () DSL.

For detaljer om SSO-support i den nye stak, se vores Simple Single Sign-On med Spring Security OAuth2.

7. Spring Boot 2 Security vs Spring Boot 1 Security

Sammenlignet med Spring Boot 1, Spring Boot 2 har i høj grad forenklet den automatiske konfiguration.

I Spring Boot 2, hvis vi ønsker vores egen sikkerhedskonfiguration, kan vi blot tilføje en brugerdefineret WebSecurityConfigurerAdapter. Dette deaktiverer den automatiske standardkonfiguration og aktiverer vores brugerdefinerede sikkerhedskonfiguration.

Spring Boot 2 bruger de fleste af Spring Securitys standardindstillinger. På grund af dette, nogle af de slutpunkter, der som standard ikke var sikrede i Spring Boot 1, er nu sikret som standard.

Disse slutpunkter inkluderer statiske ressourcer som / css / **, / js / **, / images / **, / webjars / **, /**/favicon.ico og fejlendepunktet. Hvis vi har brug for at tillade uautentificeret adgang til disse slutpunkter, kan vi eksplicit konfigurere det.

For at forenkle den sikkerhedsrelaterede konfiguration, Spring Boot 2 har fjernet følgende Spring Boot 1-egenskaber:

security.basic.authorize-mode security.basic.enabled security.basic.path security.basic.realm security.enable-csrf security.headers.cache security.headers.content-security-policy security.headers.content-security-policy -mode security.headers.content-type security.headers.frame security.headers.hsts security.headers.xss security.ignored security.require-ssl security.sessions

8. Konklusion

I denne artikel fokuserede vi på standardsikkerhedskonfigurationen fra Spring Boot. Vi så, hvordan den automatiske sikkerhedskonfigurationsmekanisme kan deaktiveres eller tilsidesættes, og hvordan en ny sikkerhedskonfiguration kan anvendes.

Kildekoden til OAuth2 kan findes på vores OAuth2 GitHub-arkiv til ældre og ny stak. Resten af ​​koden kan findes på tutorials GitHub.