Spring Boot Security Auto-configuratie

1. Inleiding

In dit artikel zullen we de eigenzinnige benadering van beveiliging door Spring Boot bekijken.

Simpel gezegd, we gaan ons concentreren op de standaardbeveiligingsconfiguratie en hoe we deze kunnen uitschakelen of aanpassen als dat nodig is.

2. Standaard beveiligingsinstellingen

Om beveiliging aan onze Spring Boot-applicatie toe te voegen, moeten we het afhankelijkheid van beveiligingsstarters:

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

Dit omvat de SecurityAutoConfiguration class - met de initiële / standaard beveiligingsconfiguratie.

Merk op dat we de versie hier niet hebben gespecificeerd, in de veronderstelling dat het project Boot al als ouder gebruikt.

Simpel gezegd, standaard wordt de authenticatie ingeschakeld voor de applicatie. Ook wordt inhoudsonderhandeling gebruikt om te bepalen of basic of formLogin moet worden gebruikt.

Er zijn enkele voorgedefinieerde eigenschappen, zoals:

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

Als we het wachtwoord niet configureren met de vooraf gedefinieerde eigenschap spring.security.user.password en start de applicatie, we zullen zien dat een standaardwachtwoord willekeurig wordt gegenereerd en afgedrukt in het consolelogboek:

Standaard beveiligingswachtwoord gebruiken: c8be15de-4488-4490-9dc6-fab3f91435c6

Zie het gedeelte over beveiligingseigenschappen van de referentiepagina Spring Boot Common Application Properties voor meer standaardinstellingen.

3. De automatische configuratie uitschakelen

Om de automatische configuratie van de beveiliging te negeren en onze eigen configuratie toe te voegen, moeten we het SecurityAutoConfiguration klasse.

Dit kan via een simpele uitsluiting:

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

Of door een configuratie toe te voegen aan het application.properties het dossier:

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

Er zijn ook enkele specifieke gevallen waarin deze opstelling niet voldoende is.

Bijna elke Spring Boot-applicatie wordt bijvoorbeeld gestart met Actuator in het klassenpad. Dit veroorzaakt problemen omdat een andere autoconfiguratieklasse degene nodig heeft die we zojuist hebben uitgesloten, dus de applicatie start niet.

Om dit probleem op te lossen, moeten we die klasse uitsluiten; en, specifiek voor de Actuator-situatie, moeten we uitsluiten ManagementWebSecurityAutoConfiguration.

3.1. Automatische configuratie van beveiliging uitschakelen versus overtreffen

Er is een significant verschil tussen het uitschakelen van autoconfiguratie en het overtreffen ervan.

Door het uit te schakelen, is het net alsof u de Spring Security-afhankelijkheid en de hele installatie helemaal opnieuw toevoegt. Dit kan in verschillende gevallen handig zijn:

  1. Applicatiebeveiliging integreren met een aangepaste beveiligingsprovider
  2. Migratie van een verouderde Spring-applicatie met al bestaande beveiligingsinstellingen - naar Spring Boot

Maar meestal hoeven we de automatische configuratie van de beveiliging niet volledig uit te schakelen.

De manier waarop Spring Boot is geconfigureerd, maakt het mogelijk om de automatisch geconfigureerde beveiliging te overtreffen door onze nieuwe / aangepaste configuratieklassen toe te voegen. Dit is doorgaans eenvoudiger, omdat we alleen een bestaande beveiligingsconfiguratie aanpassen om aan onze behoeften te voldoen.

4. Spring Boot Security configureren

Als we het pad hebben gekozen om de automatische configuratie van de beveiliging uit te schakelen, moeten we natuurlijk onze eigen configuratie opgeven.

Zoals we eerder hebben besproken, is dit de standaard beveiligingsconfiguratie; we kunnen het aanpassen door het eigenschappenbestand te wijzigen.

We kunnen bijvoorbeeld het standaardwachtwoord opheffen door ons eigen wachtwoord toe te voegen:

spring.security.user.password = wachtwoord

Als we een meer flexibele configuratie willen, met bijvoorbeeld meerdere gebruikers en rollen, moeten we gebruik maken van een full @Configuratie klasse:

@Configuration @EnableWebSecurity openbare klasse BasicConfiguration breidt WebSecurityConfigurerAdapter uit {@Override protected void configure (AuthenticationManagerBuilder auth) gooit uitzondering {PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder (); auth .inMemoryAuthentication () .withUser ("gebruiker") .password (encoder.encode ("wachtwoord")) .roles ("USER") .en () .withUser ("admin") .password (encoder.encode (" admin ")) .roles (" USER "," ADMIN "); } @Override beschermde ongeldige configuratie (HttpSecurity http) genereert Uitzondering {http .authorizeRequests () .anyRequest () .authenticated () .and () .httpBasic (); }}

De @EnableWebSecurity annotatie is cruciaal als we de standaard beveiligingsconfiguratie uitschakelen.

Als deze ontbreekt, start de applicatie niet. De annotatie is alleen optioneel als we het standaardgedrag overschrijven met een WebSecurityConfigurerAdapter.

Merk ook op dat we moet de Wachtwoord Encoder om de wachtwoorden in te stellen bij gebruik van Spring Boot 2. Zie onze handleiding over de standaard wachtwoord-encoder in Spring Security 5 voor meer informatie.

Nu moeten we controleren of onze beveiligingsconfiguratie correct van toepassing is door middel van een paar snelle live tests:

@RunWith (SpringRunner.class) @SpringBootTest (webEnvironment = RANDOM_PORT) openbare klasse BasicConfigurationIntegrationTest {TestRestTemplate restTemplate; URL-basis; @LocalServerPort int poort; @Before public void setUp () gooit MalformedURLException {restTemplate = new TestRestTemplate ("gebruiker", "wachtwoord"); base = nieuwe URL ("// localhost:" + poort); } @Test openbare leegte whenLoggedUserRequestsHomePage_ThenSuccess () gooit IllegalStateException, IOException {ResponseEntity response = restTemplate.getForEntity (base.toString (), String.class); assertEquals (HttpStatus.OK, response.getStatusCode ()); assertTrue (response.getBody (). bevat ("Baeldung")); } @Test public void whenUserWithWrongCredentials_thenUnauthorizedPage () genereert uitzondering {restTemplate = new TestRestTemplate ("gebruiker", "wrongpassword"); ResponseEntity response = restTemplate.getForEntity (base.toString (), String.class); assertEquals (HttpStatus.UNAUTHORIZED, response.getStatusCode ()); assertTrue (response.getBody (). bevat ("Unauthorized")); }}

Het idee is dat achter Spring Boot Security in feite Spring Security zit, dus elke beveiligingsconfiguratie die hiermee kan worden gedaan, of elke integratie die deze ondersteunt, kan ook in Spring Boot worden geïmplementeerd.

5. Spring Boot OAuth2 automatische configuratie (met behulp van legacy stack)

Spring Boot heeft een speciale automatische configuratie-ondersteuning voor OAuth2.

Spring Security OAuth-ondersteuning die bij Spring Boot 1.x werd geleverd, werd verwijderd in latere opstartversies in plaats van eersteklas OAuth-ondersteuning die wordt meegeleverd met Spring Security 5. We zullen zien hoe we dat kunnen gebruiken in de volgende sectie.

Voor de legacy-stack (met Spring Security OAuth), moeten we eerst een Maven-afhankelijkheid toevoegen om onze applicatie in te stellen:

 org.springframework.security.oauth spring-security-oauth2 

Deze afhankelijkheid omvat een set klassen die in staat zijn om het auto-configuratiemechanisme te activeren dat is gedefinieerd in OAuth2AutoConfiguration klasse.

Nu hebben we meerdere keuzes om door te gaan, afhankelijk van de reikwijdte van onze applicatie.

5.1. Automatische configuratie van de OAuth2-autorisatieserver

Als we willen dat onze applicatie een OAuth2-provider is, kunnen we @EnableAuthorizationServer.

Bij het opstarten zullen we in de logboeken zien dat de autoconfiguratieklassen een client-ID en een client-secret voor onze autorisatieserver genereren en natuurlijk een willekeurig wachtwoord voor basisauthenticatie.

Standaard beveiligingswachtwoord gebruiken: a81cb256-f243-40c0-a585-81ce1b952a98 security.oauth2.client.client-id = 39d2835b-1f87-4a77-9798-e2975f36972e security.oauth2.client.client-secret = f1463f8b-0791 -521b86c55b71

Deze inloggegevens kunnen worden gebruikt om een ​​toegangstoken te verkrijgen:

curl -X POST -u 39d2835b-1f87-4a77-9798-e2975f36972e: f1463f8b-0791-46fe-9269-521b86c55b71 \ -d grant_type = client_credentials -d gebruikersnaam = gebruiker -d wachtwoord = a81cb256-f243-952c0-a81cb256-f243-952c0-a81cb256-f243-952ce0 -d scope = write // localhost: 8080 / oauth / token

Ons andere artikel geeft meer details over het onderwerp.

5.2. Andere Spring Boot OAuth2 automatische configuratie-instellingen

Er zijn enkele andere use-cases die worden gedekt door Spring Boot OAuth2, zoals:

  1. Bronserver - @EnableResourceServer
  2. Client-applicatie - @ EnableOAuth2Sso of @ EnableOAuth2Client

Als we onze applicatie nodig hebben om een ​​van de bovenstaande typen te zijn, hoeven we alleen wat configuratie toe te voegen aan de applicatie-eigenschappen, zoals beschreven door de links waarnaar hierboven wordt verwezen.

Alle OAuth2-specifieke eigenschappen zijn te vinden in Spring Boot Common Application Properties.

6. Spring Boot OAuth2 automatische configuratie (met nieuwe stack)

Om de nieuwe stack te gebruiken, moeten we afhankelijkheden toevoegen op basis van wat we willen configureren: een autorisatieserver, een bronserver of een clienttoepassing.

Laten we ze een voor een bekijken.

6.1. Ondersteuning voor OAuth2-autorisatieserver

Zoals we in de vorige sectie zagen, bood de Spring Security OAuth-stack de mogelijkheid om een ​​Authorization Server in te stellen als Spring Application. Maar het project is verouderd en Spring ondersteunt vanaf nu geen eigen autorisatieserver. In plaats daarvan wordt aanbevolen om bestaande gerenommeerde providers zoals Okta, Keycloak en Forgerock te gebruiken.

Spring Boot maakt het ons echter gemakkelijk om dergelijke providers te configureren. Voor een voorbeeld van een Keycloak-configuratie kunnen we ofwel A Quick Guide to Using Keycloak with Spring Boot of Keycloak Embedded in a Spring Boot-applicatie raadplegen.

6.2. OAuth2 Resource Server-ondersteuning

Om ondersteuning voor een bronserver op te nemen, moeten we deze afhankelijkheid toevoegen:

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

Ga voor de laatste versie-informatie naar Maven Central.

Bovendien moeten we in onze beveiligingsconfiguratie het oauth2ResourceServer () DSL:

@Configuration public class JWTSecurityConfig breidt WebSecurityConfigurerAdapter uit {@Override protected void configure (HttpSecurity http) gooit uitzondering {http ... .oauth2ResourceServer (oauth2 -> oauth2.jwt ()); ...}}

Onze OAuth 2.0 Resource Server met Spring Security 5 geeft een diepgaand overzicht van dit onderwerp.

6.3. OAuth2 Client-ondersteuning

Net als hoe we een bronserver hebben geconfigureerd, heeft een clienttoepassing ook zijn eigen afhankelijkheden en DSL's nodig.

Dit is de specifieke afhankelijkheid voor OAuth2-clientondersteuning:

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

De nieuwste versie is te vinden op Maven Central.

Spring Security 5 biedt ook eersteklas inlogondersteuning via zijn oath2Login () DSL.

Raadpleeg onze Simple Single Sign-On met Spring Security OAuth2 voor meer informatie over SSO-ondersteuning in de nieuwe stack.

7. Spring Boot 2-beveiliging versus Spring Boot 1-beveiliging

Vergeleken met Spring Boot 1, Spring Boot 2 heeft de automatische configuratie aanzienlijk vereenvoudigd.

Als we in Spring Boot 2 onze eigen beveiligingsconfiguratie willen, kunnen we eenvoudig een aangepast WebSecurityConfigurerAdapter. Hierdoor wordt de standaard automatische configuratie uitgeschakeld en onze aangepaste beveiligingsconfiguratie ingeschakeld.

Spring Boot 2 gebruikt de meeste standaardinstellingen van Spring Security. Door dit, sommige van de eindpunten die standaard onbeveiligd waren in Spring Boot 1, zijn nu standaard beveiligd.

Deze eindpunten omvatten statische bronnen zoals / css / **, / js / **, / images / **, / webjars / **, /**/favicon.ico en het fouteindpunt. Als we niet-geverifieerde toegang tot deze eindpunten moeten toestaan, kunnen we dat expliciet configureren.

Om de veiligheidsgerelateerde configuratie te vereenvoudigen, Spring Boot 2 heeft de volgende Spring Boot 1-eigenschappen verwijderd:

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. Conclusie

In dit artikel hebben we ons gericht op de standaardbeveiligingsconfiguratie van Spring Boot. We hebben gezien hoe het automatische configuratiemechanisme voor beveiliging kan worden uitgeschakeld of overschreven en hoe een nieuwe beveiligingsconfiguratie kan worden toegepast.

De broncode voor OAuth2 is te vinden op onze OAuth2 GitHub-repository, voor legacy en nieuwe stack. De rest van de code is te vinden op tutorials GitHub.