Automatska konfiguracija proljetnog pokretanja

1. Uvod

U ovom ćemo članku pogledati promišljeni pristup Spring Boota sigurnosti.

Jednostavno rečeno, usredotočit ćemo se na zadanu sigurnosnu konfiguraciju i na to kako je možemo onemogućiti ili prilagoditi ako je potrebno.

2. Zadana sigurnosna postavka

Da bismo dodali sigurnost našoj aplikaciji Spring Boot, moramo dodati ovisnost o pokretaču sigurnosti:

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

To će uključivati SecurityAutoConfiguration klasa - sadrži početnu / zadanu sigurnosnu konfiguraciju.

Primijetite kako ovdje nismo naveli verziju, uz pretpostavku da projekt već koristi Boot kao roditelj.

Jednostavno rečeno, prema zadanim postavkama provjera autentičnosti postaje omogućena za Aplikaciju. Također, pregovaranje o sadržaju koristi se da bi se utvrdilo treba li koristiti basic ili formLogin.

Postoje neka unaprijed definirana svojstva, kao što su:

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

Ako lozinku ne konfiguriramo pomoću unaprijed definiranog svojstva proljeće.sigurnost.korisnik. lozinka i pokrenite aplikaciju, primijetit ćemo da se zadana lozinka nasumično generira i ispisuje u dnevniku konzole:

Upotreba zadane sigurnosne lozinke: c8be15de-4488-4490-9dc6-fab3f91435c6

Za više zadanih postavki pogledajte odjeljak sigurnosnih svojstava referentne stranice Spring Boot Common Application Properties.

3. Onemogućavanje automatske konfiguracije

Da bismo odbacili sigurnosnu automatsku konfiguraciju i dodali vlastitu konfiguraciju, moramo izuzeti SecurityAutoConfiguration razred.

To se može učiniti jednostavnim izuzećem:

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

Ili dodavanjem neke konfiguracije u primjena.svojstva datoteka:

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

Postoje i određeni slučajevi u kojima ova postavka nije sasvim dovoljna.

Na primjer, gotovo se svaka aplikacija Spring Boot pokreće s Actuatorom na putu predavanja. To uzrokuje probleme jer drugoj klasi automatske konfiguracije treba ona koju smo upravo izuzeli, tako da se aplikacija neće uspjeti pokrenuti.

Da bismo riješili ovaj problem, moramo izuzeti tu klasu; i, specifično za situaciju s aktuatorom, moramo isključiti ManagementWebSecurityAutoConfiguration.

3.1. Onemogućavanje ili nadmašivanje sigurnosne automatske konfiguracije

Postoji značajna razlika između onemogućavanja automatske konfiguracije i nadmašivanja.

Ako ga onemogućite, to je isto kao da dodate ovisnost Spring Security i cijelu postavku ispočetka. To može biti korisno u nekoliko slučajeva:

  1. Integriranje zaštite aplikacija s prilagođenim pružateljem zaštite
  2. Migriranje naslijeđene proljetne aplikacije s već postojećim sigurnosnim postavkama - na Spring Boot

No, najčešće nećemo trebati potpuno onemogućiti sigurnosnu automatsku konfiguraciju.

Način na koji je konfiguriran Spring Boot omogućuje nadmašivanje automatski konfigurirane sigurnosti dodavanjem naših novih / prilagođenih klasa konfiguracije. To je obično lakše, jer upravo prilagođavamo postojeće sigurnosne postavke kako bi udovoljili našim potrebama.

4. Konfiguriranje sigurnosti proljetnog pokretanja

Ako smo odabrali put onemogućavanja sigurnosne automatske konfiguracije, naravno, moramo osigurati vlastitu konfiguraciju.

Kao što smo već razgovarali, ovo je zadana sigurnosna konfiguracija; možemo ga prilagoditi izmjenom datoteke svojstava.

Na primjer, možemo nadjačati zadanu lozinku dodavanjem vlastite:

spring.security.user.password = lozinka

Ako želimo fleksibilniju konfiguraciju, na primjer s više korisnika i uloga - moramo iskoristiti cjelovitu @Konfiguracija razred:

@Configuration @EnableWebSecurity javna klasa BasicConfiguration proširuje WebSecurityConfigurerAdapter {@Override zaštićena void konfiguracija (AuthenticationManagerBuilder auth) baca izuzetak {PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder; auth .inMemoryAuthentication () .withUser ("user") .password (encoder.encode ("password")) .roles ("USER") .and () .withUser ("admin") .password (encoder.encode (" admin ")) .roles (" KORISNIK "," UPRAVNIK "); } @Override zaštićena void konfiguracija (HttpSecurity http) baca iznimku {http .authorizeRequests () .anyRequest () .authenticated () .and () .httpBasic (); }}

The @EnableWebSecurity napomena je presudna ako onemogućimo zadanu sigurnosnu konfiguraciju.

Ako nedostaje, aplikacija se neće pokrenuti. Bilješka je neobavezna samo ako samo nadjačavamo zadano ponašanje pomoću a WebSecurityConfigurerAdapter.

Također, primijetite da mi trebate koristiti PasswordEncoder za postavljanje lozinki prilikom korištenja Spring Boot 2. Za više detalja pogledajte naš vodič o Zadanom koderu lozinke u Spring Security 5.

Sada bismo trebali provjeriti da li se naša sigurnosna konfiguracija pravilno primjenjuje pomoću nekoliko brzih testova uživo:

@RunWith (SpringRunner.class) @SpringBootTest (webEnvironment = RANDOM_PORT) javna klasa BasicConfigurationIntegrationTest {TestRestTemplate restTemplate; Baza URL-a; @LocalServerPort int port; @Prije javne void setUp () baca MalformedURLException {restTemplate = new TestRestTemplate ("korisnik", "lozinka"); baza = novi URL ("// localhost:" + port); } @Test public void whenLoggedUserRequestsHomePage_ThenSuccess () baca IllegalStateException, IOException {ResponseEntity response = restTemplate.getForEntity (base.toString (), String.class); assertEquals (HttpStatus.OK, response.getStatusCode ()); assertTrue (response.getBody (). sadrži ("Baeldung")); } @Test public void whenUserWithWrongCredentials_thenUnauthorizedPage () baca izuzetak {restTemplate = new TestRestTemplate ("user", "wrongpassword"); ResponseEntity odgovor = restTemplate.getForEntity (base.toString (), String.class); assertEquals (HttpStatus.UNAUTHORIZED, response.getStatusCode ()); assertTrue (response.getBody (). sadrži ("Neovlašteno")); }}

Ideja je da iza Spring Boot Security zapravo stoji Spring Security, pa se svaka sigurnosna konfiguracija koja se može obaviti s ovom ili bilo koja integracija koju ovaj podržava može implementirati u Spring Boot.

5. Automatska konfiguracija proljetnog pokretanja OAuth2 (koristeći naslijeđeni stog)

Spring Boot ima namjensku podršku za automatsko konfiguriranje za OAuth2.

Podrška za Spring Security OAuth koja je dolazila s Spring Boot 1.x uklonjena je u kasnijim verzijama pokretanja umjesto prvoklasne podrške OAuth koja dolazi u paketu s Spring Security 5. U sljedećem ćemo odjeljku vidjeti kako ćemo to koristiti.

Za naslijeđeni stek (koristeći Spring Security OAuth), prvo ćemo morati dodati ovisnost Mavena da bismo započeli s postavljanjem naše aplikacije:

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

Ova ovisnost uključuje skup klasa koje mogu pokrenuti mehanizam automatske konfiguracije definiran u OAuth2AutoConfiguration razred.

Sada imamo više izbora za nastavak, ovisno o opsegu naše prijave.

5.1. Automatska konfiguracija OAuth2 poslužitelja za autorizaciju

Ako želimo da naša aplikacija bude dobavljač OAuth2, možemo je koristiti @EnableAuthorizationServer.

Prilikom pokretanja primijetit ćemo u zapisnicima da će klase automatske konfiguracije generirati ID klijenta i klijentsku tajnu za naš autorizacijski poslužitelj i naravno slučajnu lozinku za osnovnu provjeru autentičnosti.

Upotreba zadane sigurnosne lozinke: a81cb256-f243-40c0-a585-81ce1b952a98 security.oauth2.client.client-id = 39d2835b-1f87-4a77-9798-e2975f36972e security.oauth2.client.client-secret = f1463f8b-0791-46fe -521b86c55b71

Ove se vjerodajnice mogu koristiti za dobivanje pristupnog tokena:

curl -X POST -u 39d2835b-1f87-4a77-9798-e2975f36972e: f1463f8b-0791-46fe-9269-521b86c55b71 \ -d grant_type = client_credentials -d korisničko ime = korisnik -d lozinka = a81cb256-f243-40c0-a5852a -d opseg = write // localhost: 8080 / oauth / token

Naš drugi članak pruža daljnje detalje o toj temi.

5.2. Ostale postavke automatske konfiguracije za proljetno pokretanje OAuth2

Postoje još neki slučajevi upotrebe obuhvaćeni Spring Boot OAuth2, poput:

  1. Resursni poslužitelj - @EnableResourceServer
  2. Prijava klijenta - @ EnableOAuth2Sso ili @ EnableOAuth2Client

Ako trebamo da naša aplikacija bude jedna od gornjih vrsta, samo moramo dodati neku konfiguraciju svojstvima aplikacije, kako je detaljno opisano na gore navedenim vezama.

Sva specifična svojstva OAuth2 mogu se naći na općenitim svojstvima aplikacije Spring Boot.

6. Automatska konfiguracija Spring Oot OAuth2 (pomoću novog stoga)

Da bismo koristili novi stog, trebamo dodati ovisnosti na temelju onoga što želimo konfigurirati - autorizacijski poslužitelj, poslužitelj resursa ili klijentska aplikacija.

Pogledajmo ih jednog po jednog.

6.1. Podrška poslužitelja za autorizaciju OAuth2

Kao što smo vidjeli u prethodnom odjeljku, stog Spring Security OAuth ponudio je mogućnost postavljanja Autorizacijskog poslužitelja kao proljetne aplikacije. No projekt je zastario i Spring od sada ne podržava vlastiti autorizacijski poslužitelj. Umjesto toga, preporučuje se korištenje postojećih dobro uspostavljenih dobavljača kao što su Okta, Keycloak i Forgerock.

Međutim, Spring Boot nam olakšava konfiguriranje takvih davatelja usluga. Za primjer konfiguracije Keycloak-a možemo se obratiti ili Kratkom vodiču za upotrebu Keycloak-a s proljetnim pokretanjem ili Keycloak-u ugrađenom u Spring Boot Application.

6.2. Podrška za poslužitelj resursa OAuth2

Da bismo uključili podršku za poslužitelj resursa, moramo dodati ovu ovisnost:

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

Da biste saznali najnovije verzije, idite u Maven Central.

Uz to, u našu sigurnosnu konfiguraciju moramo uključiti i oauth2ResourceServer () DSL:

@Configuration javna klasa JWTSecurityConfig proširuje WebSecurityConfigurerAdapter {@Override zaštićena void konfiguracija (HttpSecurity http) baca izuzetak {http ... .oauth2ResourceServer (oauth2 -> oauth2.jwt ()); ...}}

Naš OAuth 2.0 Resursni poslužitelj s Spring Security 5 daje detaljan prikaz ove teme.

6.3. Podrška za klijenta OAuth2

Slično kao što smo konfigurirali poslužitelj resursa, i klijentska aplikacija treba vlastite ovisnosti i DSL-ove.

Evo specifične ovisnosti za podršku klijenta OAuth2:

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

Najnoviju verziju možete pronaći na Maven Central.

Spring Security 5 također pruža prvoklasnu podršku za prijavu putem svog oath2Login () DSL.

Pojedinosti o SSO podršci u novom stogu potražite u našoj Jednostavnoj jedinstvenoj prijavi s Spring Security OAuth2.

7. Spring Boot 2 Security vs Spring Boot 1 Security

U usporedbi s Spring Boot 1, Spring Boot 2 uvelike je pojednostavio automatsku konfiguraciju.

U Spring Boot 2, ako želimo vlastitu sigurnosnu konfiguraciju, možemo jednostavno dodati prilagođenu WebSecurityConfigurerAdapter. Ovo će onemogućiti zadanu automatsku konfiguraciju i omogućiti našu prilagođenu sigurnosnu konfiguraciju.

Spring Boot 2 koristi većinu zadanih postavki Spring Securitya. Zbog ovoga, neke krajnje točke koje nisu bile osigurane prema zadanim postavkama u Spring Boot 1 sada su osigurane prema zadanim postavkama.

Te krajnje točke uključuju statičke resurse poput / css / **, / js / **, / images / **, / webjars / **, /**/favicon.ico i krajnju točku pogreške. Ako trebamo omogućiti neautentificirani pristup tim krajnjim točkama, to možemo izričito konfigurirati.

Da biste pojednostavili sigurnosnu konfiguraciju, Spring Boot 2 uklonio je sljedeća svojstva 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.sessions

8. Zaključak

U ovom smo se članku usredotočili na zadanu sigurnosnu konfiguraciju koju pruža Spring Boot. Vidjeli smo kako se sigurnosni mehanizam automatske konfiguracije može onemogućiti ili poništiti i kako se može primijeniti nova sigurnosna konfiguracija.

Izvorni kod za OAuth2 možete pronaći na našem OAuth2 GitHub repozitorijumu, radi naslijeđa i novog stoga. Ostatak koda možete pronaći na tutorialima GitHub.