Spring Boot Security Auto-Konfiguration

Automatische Konfiguration der Spring Boot-Sicherheit

1. Einführung

In diesem Artikel werfen wir einen Blick auf den Sicherheitsansatz von Spring Boot.

Einfach ausgedrückt, konzentrieren wir uns auf die Standardsicherheitskonfiguration und darauf, wie wir sie bei Bedarf deaktivieren oder anpassen können.

Weitere Lektüre:

Spring Security - Sicherheit keine, Filter keine, ZugriffserlaubnisAlle

Die Unterschiede zwischen access = "permitAll", filters = "none", security = "none" in Spring Security.

Read more

Spring Sicherheitsformular Login

Ein Beispiel für die Anmeldung im Frühjahr - Einrichten eines einfachen Anmeldeformulars, einer grundlegenden XML-Sicherheitskonfiguration und weiterer erweiterter Konfigurationstechniken.

Read more

2. Standardsicherheits-Setup

Um unserer Spring Boot-Anwendung Sicherheit zu verleihen, müssen wir diesecurity starter dependency hinzufügen:


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

Dies schließt die KlasseSecurityAutoConfigurationein, die die anfängliche / standardmäßige Sicherheitskonfiguration enthält.

Beachten Sie, dass wir die Version hier nicht angegeben haben, mit der Annahme, dass das Projekt Boot bereits als übergeordnetes Element verwendet.

Einfach ausgedrückt,by default, the Authentication gets enabled for the Application. Also, content negotiation is used to determine if basic or formLogin should be used.

Es gibt einige vordefinierte Eigenschaften, wie zum Beispiel:

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

Wenn wir das Kennwort nicht mit der vordefinierten Eigenschaftspring.security.user.password konfigurieren und die Anwendung starten, werden wir feststellen, dass ein Standardkennwort zufällig generiert und im Konsolenprotokoll gedruckt wird:

Using default security password: c8be15de-4488-4490-9dc6-fab3f91435c6

Weitere Standardeinstellungen finden Sie im Abschnitt Sicherheitseigenschaften auf der Referenzseite vonSpring Boot Common Application Properties.

3. Deaktivieren der automatischen Konfiguration

Um die automatische Sicherheitskonfiguration zu verwerfen und unsere eigene Konfiguration hinzuzufügen, müssen wir die KlasseSecurityAutoConfigurationausschließen.

Dies kann durch einen einfachen Ausschluss erfolgen:

@SpringBootApplication(exclude = { SecurityAutoConfiguration.class })
public class SpringBootSecurityApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootSecurityApplication.class, args);
    }
}

Oder indem Sie derapplication.properties-Datei eine Konfiguration hinzufügen:

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

Es gibt auch einige besondere Fälle, in denen dieses Setup nicht ausreicht.

Beispielsweise wird fast jede Spring Boot-Anwendung mit Actuator im Klassenpfad gestartet. This causes problems because another auto-configuration class needs the one we’ve just excluded, sodass die Anwendung nicht gestartet werden kann.

Um dieses Problem zu beheben, müssen wir diese Klasse ausschließen. und spezifisch für die Aktuatorsituation müssen wirManagementWebSecurityAutoConfiguration ausschließen.

3.1. Deaktivieren vs. Automatische Sicherheitskonfiguration übertreffen

Es gibt einen signifikanten Unterschied zwischen dem Deaktivieren und dem Überschreiten der Autokonfiguration.

Wenn Sie es deaktivieren, müssen Sie lediglich die Spring Security-Abhängigkeit und das gesamte Setup von Grund auf neu hinzufügen. Dies kann in mehreren Fällen nützlich sein:

  1. Integrieren der Anwendungssicherheit in einen benutzerdefinierten Sicherheitsanbieter

  2. Migrieren einer älteren Spring-Anwendung mit bereits vorhandener Sicherheitseinstellung zu Spring Boot

Meistens müssen wir die automatische Sicherheitskonfiguration jedoch nicht vollständig deaktivieren.

Die Art und Weise, wie Spring Boot konfiguriert ist, ermöglicht es, die automatisch konfigurierte Sicherheit zu übertreffen, indem Sie unsere neuen / benutzerdefinierten Konfigurationsklassen hinzufügen. Dies ist in der Regel einfacher, da wir lediglich ein vorhandenes Sicherheits-Setup anpassen, um unsere Anforderungen zu erfüllen.

4. Konfigurieren der Spring Boot-Sicherheit

Wenn wir den Pfad zum Deaktivieren der automatischen Sicherheitskonfiguration gewählt haben, müssen wir natürlich unsere eigene Konfiguration bereitstellen.

Wie bereits erwähnt, ist dies die Standardsicherheitskonfiguration. Wir können es anpassen, indem wir die Eigenschaftendatei ändern.

Wir können zum Beispiel das Standardkennwort überschreiben, indem wir unser eigenes hinzufügen:

security.user.password=password

Wenn wir eine flexiblere Konfiguration wünschen, beispielsweise mit mehreren Benutzern und Rollen, müssen Sie jetzt eine vollständige@Configuration-Klasse verwenden:

@Configuration
@EnableWebSecurity
public class BasicConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth)
      throws Exception {
        auth
          .inMemoryAuthentication()
          .withUser("user")
            .password("password")
            .roles("USER")
            .and()
          .withUser("admin")
            .password("admin")
            .roles("USER", "ADMIN");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
          .authorizeRequests()
          .anyRequest()
          .authenticated()
          .and()
          .httpBasic();
    }
}

Die Annotation@EnableWebSecurityist entscheidend, wenn wir die Standardsicherheitskonfiguration deaktivieren.

Wenn dies nicht der Fall ist, kann die Anwendung nicht gestartet werden. Die Anmerkung ist nur optional, wenn wir nur das Standardverhalten mitWebSecurityConfigurerAdapter überschreiben.

Jetzt sollten wir mit ein paar kurzen Live-Tests überprüfen, ob unsere Sicherheitskonfiguration korrekt ist:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = RANDOM_PORT)
public class BasicConfigurationIntegrationTest {

    TestRestTemplate restTemplate;
    URL base;
    @LocalServerPort int port;

    @Before
    public void setUp() throws MalformedURLException {
        restTemplate = new TestRestTemplate("user", "password");
        base = new URL("http://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("example"));
    }

    @Test
    public void whenUserWithWrongCredentials_thenUnauthorizedPage()
      throws Exception {

        restTemplate = new TestRestTemplate("user", "wrongpassword");
        ResponseEntity response
          = restTemplate.getForEntity(base.toString(), String.class);

        assertEquals(HttpStatus.UNAUTHORIZED, response.getStatusCode());
        assertTrue(response
          .getBody()
          .contains("Unauthorized"));
    }
}

Die Idee dahinter ist, dass Spring Boot Security Spring Security ist, sodass jede Sicherheitskonfiguration, die mit dieser oder einer von dieser unterstützten Integration durchgeführt werden kann, auch in Spring Boot implementiert werden kann.

5. Spring Boot OAuth2 Auto-Konfiguration

Spring Boot bietet eine dedizierte Autokonfigurationsunterstützung für OAuth2.

Bevor wir dazu kommen, fügen wir die Maven-Abhängigkeit hinzu, um mit dem Einrichten unserer Anwendung zu beginnen:


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

Diese Abhängigkeit umfasst eine Reihe von Klassen, die den in der KlasseOAuth2AutoConfigurationdefinierten automatischen Konfigurationsmechanismus auslösen können.

Je nach Anwendungsbereich haben wir nun mehrere Möglichkeiten, um fortzufahren.

5.1. Automatische Konfiguration des OAuth2-Autorisierungsservers

Wenn unsere Anwendung ein OAuth2-Anbieter sein soll, können wir@EnableAuthorizationServer verwenden.

Beim Start werden wir in den Protokollen feststellen, dass die Autokonfigurationsklassen eine Client-ID und ein Client-Geheimnis für unseren Autorisierungsserver sowie natürlich ein zufälliges Kennwort für die Basisauthentifizierung generieren.

Using default security password: a81cb256-f243-40c0-a585-81ce1b952a98
security.oauth2.client.client-id = 39d2835b-1f87-4a77-9798-e2975f36972e
security.oauth2.client.client-secret = f1463f8b-0791-46fe-9269-521b86c55b71

Mit diesen Anmeldeinformationen kann ein Zugriffstoken abgerufen werden:

curl -X POST -u 39d2835b-1f87-4a77-9798-e2975f36972e:f1463f8b-0791-46fe-9269-521b86c55b71 \
 -d grant_type=client_credentials
 -d username=user
 -d password=a81cb256-f243-40c0-a585-81ce1b952a98 \
 -d scope=write  http://localhost:8080/oauth/token

5.2. Andere Spring Boot OAuth2-Einstellungen für die automatische Konfiguration

Es gibt einige andere Anwendungsfälle, die von Spring Boot OAuth2 abgedeckt werden, wie:

  1. Ressourcenserver -@EnableResourceServer

  2. Client-Anwendung -@EnableOAuth2Sso oder@EnableOAuth2Client

Wenn unsere Anwendung einer der oben genannten Typen sein soll, müssen wir den Anwendungseigenschaften nur einige Konfigurationen hinzufügen.

Alle OAuth2-spezifischen Eigenschaften können beiSpring Boot Common Application Properties gefunden werden.

6. Spring Boot 2 Sicherheit gegen Spring Boot 1 Sicherheit

Im Vergleich zu Spring Boot 1Spring Boot 2 has greatly simplified the auto-configuration.

Wenn wir in Spring Boot 2 eine eigene Sicherheitskonfiguration wünschen, können wir einfach ein benutzerdefiniertesWebSecurityConfigurerAdapter.hinzufügen. Dadurch wird die automatische Standardkonfiguration deaktiviert und unsere benutzerdefinierte Sicherheitskonfiguration aktiviert.

Spring Boot 2 verwendet die meisten Standardeinstellungen von Spring Security. Aus diesem Grund istsome of the endpoints that were unsecured by default in Spring Boot 1 are now secured by default.

Diese Endpunkte umfassen statische Ressourcen wie / css /, /js/, / images /, /webjars/, /**/favicon.ico und den Fehlerendpunkt. Wenn wir nicht authentifizierten Zugriff auf diese Endpunkte zulassen müssen, können wir dies explizit konfigurieren.

Um die sicherheitsrelevante Konfiguration zu vereinfachen, geben SieSpring Boot 2 has removed the following Spring Boot 1 properties:

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

7. Fazit

In diesem Artikel haben wir uns auf die von Spring Boot bereitgestellte Standardsicherheitskonfiguration konzentriert. Wir haben gesehen, wie der automatische Sicherheits-Konfigurationsmechanismus deaktiviert oder überschrieben werden kann und wie eine neue Sicherheitskonfiguration angewendet werden kann.

Der Quellcode kannover on Github gefunden werden.