Jarná automatická konfigurácia zabezpečenia bootovania

1. Úvod

V tomto článku sa pozrieme na názorový prístup Spring Boot k bezpečnosti.

Jednoducho povedané, zameriame sa na predvolenú konfiguráciu zabezpečenia a na to, ako ju môžeme v prípade potreby deaktivovať alebo prispôsobiť.

2. Predvolené nastavenie zabezpečenia

Aby sme zvýšili bezpečnosť našej aplikácie Spring Boot, musíme pridať závislosť štartéra zabezpečenia:

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

To bude zahŕňať SecurityAutoConfiguration trieda - obsahujúca počiatočnú / predvolenú konfiguráciu zabezpečenia.

Všimnite si, ako sme tu nešpecifikovali verziu s predpokladom, že projekt už ako pôvodný používa Boot.

Jednoducho povedané, v predvolenom nastavení sa pre aplikáciu povolí overenie. Vyjednávanie obsahu sa tiež používa na určenie, či sa má použiť basic alebo formLogin.

Existuje niekoľko preddefinovaných vlastností, napríklad:

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

Pokiaľ nenakonfigurujeme heslo pomocou preddefinovanej vlastnosti jar.bezpečnosť.uživateľ.heslo a spustíme aplikáciu, všimneme si, že predvolené heslo je náhodne vygenerované a vytlačené v protokole konzoly:

Používanie predvoleného bezpečnostného hesla: c8be15de-4488-4490-9dc6-fab3f91435c6

Ďalšie predvolené hodnoty nájdete v časti vlastnosti zabezpečenia na referenčnej stránke Spring Boot Common Application Properties.

3. Zakázanie automatickej konfigurácie

Ak chcete zahodiť automatickú konfiguráciu zabezpečenia a pridať vlastnú konfiguráciu, musíme vylúčiť SecurityAutoConfiguration trieda.

Môžete to urobiť jednoduchým vylúčením:

@SpringBootApplication (vylúčiť = {SecurityAutoConfiguration.class}) verejná trieda SpringBootSecurityApplication {public static void main (String [] args) {SpringApplication.run (SpringBootSecurityApplication.class, args); }} 

Alebo pridaním nejakej konfigurácie do application.properties spis:

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

Existujú aj niektoré konkrétne prípady, v ktorých toto nastavenie nestačí.

Napríklad takmer každá aplikácia Spring Boot je spustená aplikáciou Actuator v ceste triedy. To spôsobuje problémy, pretože iná trieda automatickej konfigurácie potrebuje tú, ktorú sme práve vylúčili, takže spustenie aplikácie sa nepodarí.

Aby sme tento problém vyriešili, musíme túto triedu vylúčiť; a osobitne pre situáciu aktuátora musíme vylúčiť ManagementWebSecurityAutoConfiguration.

3.1. Zakázanie a prekonanie automatickej konfigurácie zabezpečenia

Medzi deaktiváciou automatickej konfigurácie a jej prekonaním je podstatný rozdiel.

Jeho deaktiváciou je to ako keby ste od začiatku pridali závislosť Spring Security a celé nastavenie. To môže byť užitočné v niekoľkých prípadoch:

  1. Integrácia zabezpečenia aplikácií s vlastným poskytovateľom zabezpečenia
  2. Migrácia staršej jarnej aplikácie s už existujúcim nastavením zabezpečenia - na Spring Boot

Väčšinou však nebudeme musieť úplne deaktivovať automatickú konfiguráciu zabezpečenia.

Spôsob konfigurácie Spring Boot umožňuje prekonať automaticky nakonfigurované zabezpečenie pridaním našich nových / vlastných konfiguračných tried. To je zvyčajne jednoduchšie, pretože práve prispôsobujeme existujúce nastavenie zabezpečenia tak, aby vyhovovalo našim potrebám.

4. Konfigurácia zabezpečenia Spring Boot

Ak sme zvolili cestu zakázania automatickej konfigurácie zabezpečenia, musíme prirodzene poskytnúť našu vlastnú konfiguráciu.

Ako sme už diskutovali, toto je predvolená konfigurácia zabezpečenia; môžeme ho prispôsobiť úpravou súboru vlastností.

Môžeme napríklad prepísať predvolené heslo pridaním nášho vlastného:

spring.security.user.password = heslo

Ak chceme flexibilnejšiu konfiguráciu, napríklad s viacerými používateľmi a rolami - musíme využiť celú @ Konfigurácia trieda:

@Configuration @EnableWebSecurity verejná trieda BasicConfiguration rozširuje WebSecurityConfigurerAdapter {@Override protected void configure (AuthenticationManagerBuilder auth) vyvolá výnimku {PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder (); auth .inMemoryAuthentication () .withUser ("užívateľ") .password (encoder.encode ("heslo")) .roles ("USER") .and () .withUser ("admin") .password (encoder.encode (" admin ")) .roles (" USER "," ADMIN "); } @Override protected void configure (HttpSecurity http) vyvolá výnimku {http .authorizeRequests () .anyRequest () .authenticated () .and () .httpBasic (); }}

The @EnableWebSecurity ak deaktivujeme predvolenú konfiguráciu zabezpečenia, anotácia je rozhodujúca.

Ak chýba, aplikácia sa nedá spustiť. Anotácia je voliteľná, iba ak iba prepíšeme predvolené správanie pomocou a WebSecurityConfigurerAdapter.

Všimnite si tiež, že my je potrebné použiť PasswordEncoder na nastavenie hesiel pri použití Spring Boot 2. Ďalšie informácie nájdete v našej príručke k predvolenému kódovaču hesiel v Spring Security 5.

Teraz by sme mali overiť, či naša konfigurácia zabezpečenia platí správne, pomocou niekoľkých rýchlych testov:

@RunWith (SpringRunner.class) @SpringBootTest (webEnvironment = RANDOM_PORT) verejná trieda BasicConfigurationIntegrationTest {TestRestTemplate restTemplate; Základňa URL; @LocalServerPort int port; @Before public void setUp () hodí MalformedURLException {restTemplate = nový TestRestTemplate ("užívateľ", "heslo"); base = new URL ("// localhost:" + port); } @Test public void whenLoggedUserRequestsHomePage_ThenSuccess () throws IllegalStateException, IOException {ResponseEntity response = restTemplate.getForEntity (base.toString (), String.class); assertEquals (HttpStatus.OK, response.getStatusCode ()); assertTrue (response.getBody (). contains ("Baeldung")); } @Test public void whenUserWithWrongCredentials_thenUnauthorizedPage () vyvolá výnimku {restTemplate = new TestRestTemplate ("user", "wrongpassword"); ResponseEntity response = restTemplate.getForEntity (base.toString (), String.class); assertEquals (HttpStatus.UNAUTHORIZED, response.getStatusCode ()); assertTrue (response.getBody (). contains ("Neoprávnené")); }}

Myšlienka je taká, že za Spring Boot Security je v skutočnosti Spring Security, takže do Spring Boot možno implementovať aj akúkoľvek konfiguráciu zabezpečenia, ktorú je možné vykonať s týmto, alebo akúkoľvek integráciu, ktorú tento podporuje.

5. Spring Boot OAuth2 Auto-Configuration (using legacy stack)

Spring Boot má vyhradenú podporu pre automatickú konfiguráciu pre OAuth2.

Podpora Spring Security OAuth, ktorá bola dodaná s Spring Boot 1.x, bola v neskorších bootovacích verziách odstránená namiesto podpory prvotriednej OAuth, ktorá je dodávaná s Spring Security 5. Uvidíme, ako to použiť v nasledujúcej časti.

Pre starší zásobník (s použitím Spring Security OAuth) najskôr budeme musieť pridať závislosť Maven, aby sme mohli začať nastavovať našu aplikáciu:

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

Táto závislosť zahŕňa množinu tried, ktoré sú schopné spustiť mechanizmus automatickej konfigurácie definovaný v OAuth2AutoConfiguration trieda.

Teraz máme niekoľko možností, ako pokračovať, v závislosti od rozsahu našej aplikácie.

5.1. Automatická konfigurácia autorizačného servera OAuth2

Ak chceme, aby naša aplikácia bola poskytovateľom protokolu OAuth2, môžeme použiť @EnableAuthorizationServer.

Pri štarte si v protokoloch všimneme, že triedy automatickej konfigurácie vygenerujú ID klienta a klientske tajomstvo pre náš autorizačný server a samozrejme náhodné heslo pre základnú autentifikáciu.

Používanie predvoleného bezpečnostného hesla: a81cb256-f243-40c0-a585-81ce1b952a98 security.oauth2.client.client-id = 39d2835b-1f87-4a77-9798-e2975f36972e security.oauth2.client.client-secret = f1463f8b-2691-46fe -521b86c55b71

Na získanie prístupového tokenu je možné použiť tieto poverenia:

curl -X POST -u 39d2835b-1f87-4a77-9798-e2975f36972e: f1463f8b-0791-46fe-9269-521b86c55b71 \ -d grant_type = client_credentials -d username = user -d heslo = a81cb256-f243-40c0-a24 -d rozsah = zápis // localhost: 8080 / oauth / token

Náš ďalší článok poskytuje ďalšie podrobnosti o tejto téme.

5.2. Ďalšie nastavenia automatickej konfigurácie Spring Boot OAuth2

Existuje niekoľko ďalších prípadov použitia, na ktoré sa vzťahuje Spring Boot OAuth2, ako napríklad:

  1. Zdrojový server - @EnableResourceServer
  2. Klientská aplikácia - @ EnableOAuth2Sso alebo @ EnableOAuth2Client

Ak potrebujeme, aby naša aplikácia bola jedným z vyššie uvedených typov, stačí do vlastností aplikácie pridať nejakú konfiguráciu, ako je to podrobne uvedené v odkazoch uvedených vyššie.

Všetky vlastnosti špecifické pre OAuth2 nájdete na stránke Spring Boot Common Application Properties.

6. Automatická konfigurácia Spring Boot OAuth2 (pomocou nového zásobníka)

Ak chcete použiť nový zásobník, musíme pridať závislosti na základe toho, čo chceme nakonfigurovať - ​​autorizačný server, server zdrojov alebo klientská aplikácia.

Pozrime sa na ne jeden po druhom.

6.1. Podpora autorizačného servera OAuth2

Ako sme videli v predchádzajúcej časti, zásobník Spring Security OAuth ponúkol možnosť nastavenia autorizačného servera ako jarnej aplikácie. Projekt je však zastaraný a Spring odteraz nepodporuje vlastný autorizačný server. Namiesto toho sa odporúča využiť existujúcich osvedčených poskytovateľov, ako sú Okta, Keycloak a Forgerock.

Spring Boot nám však uľahčuje konfiguráciu týchto poskytovateľov. Ako príklad konfigurácie Keycloak si môžeme pozrieť buď Stručného sprievodcu používaním Keycloak s Spring Boot alebo Keycloak vloženého do aplikácie Spring Boot.

6.2. Podpora servera OAuth2

Ak chcete zahrnúť podporu pre zdrojový server, musíme pridať túto závislosť:

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

Informácie o najnovšej verzii nájdete v Maven Central.

Okrem toho do našej konfigurácie zabezpečenia musíme zahrnúť oauth2ResourceServer () DSL:

@Configuration verejná trieda JWTSecurityConfig rozširuje WebSecurityConfigurerAdapter {@Override chránená neplatná konfigurácia (HttpSecurity http) vyvolá výnimku {http ... .oauth2ResourceServer (oauth2 -> oauth2.jwt ()); ...}}

Náš zdrojový server OAuth 2.0 so Spring Security 5 poskytuje podrobný pohľad na túto tému.

6.3. Podpora klientov OAuth2

Podobne ako sme nakonfigurovali server zdrojov, aj klientská aplikácia potrebuje svoje vlastné závislosti a DSL.

Tu je konkrétna závislosť pre podporu klientov OAuth2:

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

Najnovšiu verziu nájdete v Maven Central.

Spring Security 5 tiež poskytuje prvotriednu podporu prihlásenia prostredníctvom svojho oath2Login () DSL.

Podrobnosti o podpore jednotného prihlásenia v novom zásobníku nájdete v našom jednoduchom jednotnom prihlásení s jarným zabezpečením OAuth2.

7. Zabezpečenie Spring Boot 2 vs Zabezpečenie Spring Boot 1

V porovnaní s Spring Boot 1, Spring Boot 2 výrazne zjednodušil automatickú konfiguráciu.

V Spring Boot 2, ak chceme vlastnú konfiguráciu zabezpečenia, môžeme jednoducho pridať vlastnú WebSecurityConfigurerAdapter. Zakáže sa tým predvolená automatická konfigurácia a povolí sa naša vlastná konfigurácia zabezpečenia.

Spring Boot 2 využíva väčšinu predvolených nastavení Spring Security. Kvôli tomu, niektoré z koncových bodov, ktoré boli predvolene nezabezpečené v Spring Boot 1, sú teraz predvolene zabezpečené.

Medzi tieto koncové body patria statické prostriedky ako / css / **, / js / **, / images / **, / webjars / **, /**/favicon.ico a koncový bod chyby. Ak potrebujeme povoliť neautentizovaný prístup k týmto koncovým bodom, môžeme to explicitne nakonfigurovať.

Na zjednodušenie konfigurácie súvisiacej so zabezpečením Spring Boot 2 odstránil nasledujúce vlastnosti Spring Boot 1:

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

8. Záver

V tomto článku sme sa zamerali na predvolenú konfiguráciu zabezpečenia, ktorú poskytuje Spring Boot. Videli sme, ako je možné deaktivovať alebo prepísať mechanizmus automatickej konfigurácie zabezpečenia a ako možno použiť novú konfiguráciu zabezpečenia.

Zdrojový kód pre OAuth2 nájdete v našom repozitári OAuth2 GitHub, pre starší a nový zásobník. Zvyšok kódu nájdete na tutoriáloch GitHub.


$config[zx-auto] not found$config[zx-overlay] not found