Es ist keine Übertreibung zu sagen, dass Actuator die am meisten modifizierte Funktion von Spring Boot 2.0 ist. Wenn Sie die Details erhöhen, gibt es keine scharfen Kanten. Daher sind vorerst einige Punkte zu beachten, wenn Sie von 1.x migrieren.
Der wahrscheinlich häufigste Fehler in Actuator beim Upgrade einer vorhandenen App, die mit Boot 1.x auf 2.0 erstellt wurde, ist "404 Not Found" (zumindest habe ich das getan). Tatsächlich wurde allen Aktuatorendpunkten seit 2.0 das Präfix "/ actuator" vorangestellt. Mit anderen Worten, die zuvor als "localhost: 8080 / info" angegebene URL muss in "localhost: 8080 / actuator / info" geändert werden.
Dieses Präfix kann mit den folgenden Eigenschaften geändert werden.
application.Beispiele für Eigenschaften
#Der Standardwert ist"/actuator"
management.endpoints.web.base-path=/admin
Sie können auch die Portnummer für den Actuator-Endpunkt ändern und einen Kontextpfad hinzufügen. Bitte beachten Sie, dass der Kontextpfad nicht angehängt wird, wenn Sie die Portnummer nicht angeben.
application.Beispiele für Eigenschaften
management.server.port=9999
management.server.servlet.context-path=/admin-context
Mit anderen Worten, wenn Sie alle drei oben genannten Einstellungen schreiben, lautet der Actuator-Endpunkt "localhost: 9999 / admin-context / admin / info".
/ info
und / health
veröffentlichtDies verursacht auch einen 404-Fehler. / env
, / bean
usw. werden standardmäßig nicht veröffentlicht.
Legen Sie den Endpunkt, den Sie veröffentlichen möchten, wie folgt fest.
application.Beispiele für Eigenschaften
management.endpoints.web.exposure.include=env,beans,loggers
Wenn Sie nur eine angeben, wird diese nur veröffentlicht, wenn Sie explizit "/ info" und "/ health" angeben.
Geben Sie "*" an, wenn Sie alle Endpunkte veröffentlichen möchten.
application.Beispiele für Eigenschaften
management.endpoints.web.exposure.include=*
Umgekehrt werden Endpunkte, die nicht verfügbar gemacht werden, in "management.endpoints.web.exposure.exclude" angegeben. Wenn Sie beispielsweise wie folgt schreiben, werden alle Endpunkte außer "/ env" und "/ info" veröffentlicht.
application.Beispiele für Eigenschaften
management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.exclude=env,info
Endpunkte, die veröffentlicht werden sollen, aber nicht einzeln aktiviert sind, werden nicht veröffentlicht. Wenn Sie beispielsweise wie folgt schreiben, werden nur "/ beans" und "/ health" veröffentlicht. Obwohl / auditevents
als öffentlich angegeben ist, wird es nicht veröffentlicht, da es deaktiviert wurde.
application.Beispiele für Eigenschaften
management.endpoints.web.exposure.include=auditevents,beans,health
# /Auditevents sind deaktiviert und werden nicht veröffentlicht
management.endpoint.auditevents.enabled=false
Jeder Endpunkt kann mit
management.endpoint.xxxxx.enabled
aktiviert werden (xxxxx
ist der Endpunktname).
Ab Spring Boot 1.5 wurden vertrauliche Actuator-Endpunkte geschützt (nur Benutzer mit der Rolle "ACTUATOR" können darauf zugreifen).
Mit Spring Boot 2.0 ist das Konzept der Vertraulichkeit in erster Linie weg und alle öffentlich verfügbaren Endpunkte sind nicht mehr geschützt. Um den Endpunkt zu sichern, müssen Sie Spring Security explizit einschließen und die Sicherheitseinstellungen in Java Config schreiben.
pom.xml
...
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--Frühlingssicherheit hinzugefügt!-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
...
</dependencies>
...
JavaConfig-Beispiel
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//Erstellen Sie allgemeine Benutzer und Benutzer, um auf Actuator zuzugreifen
//(Benutzername, Passwort, Rollenname sind optional)
auth.inMemoryAuthentication()
.passwordEncoder(NoOpPasswordEncoder.getInstance()) //NoOpPasswordEncoder ist in der Produktion verboten!
.withUser("actuator").password("password").roles("ACTUATOR").and()
.withUser("user").password("password").roles("USER");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
//Aktivieren Sie die BASIC-Authentifizierung
http.httpBasic();
//Auf Actuator-Endpunkte kann nur über die ACTUATOR-Rolle zugegriffen werden.
//Auf andere kann von jeder Rolle zugegriffen werden, solange Sie angemeldet sind
http.authorizeRequests()
.requestMatchers(EndpointRequest.toAnyEndpoint()).hasRole("ACTUATOR")
.anyRequest().authenticated();
//CSRF in der Produktion nicht deaktivieren!
http.csrf().disable();
}
}
Beachten Sie, dass es zwei EndpointRequest-Klassen gibt, eine für Servlets und eine für Reaktive. Da wir diesmal von einer Servlet-Basis ausgehen, verwenden Sie bitte die EndpointRequest-Klasse des org.springframework.boot.actuate.autoconfigure.security.servlet-Pakets.
Zugriffsbeispiel mit Curl
$ curl -v -u actuator:password localhost:8080/actuator/health | jq
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8080 (#0)
* Server auth using Basic with user 'actuator'
> GET /actuator/health HTTP/1.1
> Host: localhost:8080
> Authorization: Basic YWN0dWF0b3I6cGFzc3dvcmQ=
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 200
< Set-Cookie: JSESSIONID=C472F3844F17FC8EBC779A35DEFB085F; Path=/; HttpOnly
< X-Content-Type-Options: nosniff
< X-XSS-Protection: 1; mode=block
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
< Pragma: no-cache
< Expires: 0
< X-Frame-Options: DENY
< Content-Type: application/vnd.spring-boot.actuator.v2+json;charset=UTF-8
< Transfer-Encoding: chunked
< Date: Fri, 09 Mar 2018 07:03:55 GMT
<
{ [20 bytes data]
100 15 0 15 0 0 165 0 --:--:-- --:--:-- --:--:-- 166
* Connection #0 to host localhost left intact
{
"status": "UP"
}
Wenn Sie die oben genannten drei Punkte beachten, sollten Sie in der Lage sein, die in 1.x erstellte App auf 2.0 zu aktualisieren und vorerst auszuführen. Es gibt jedoch noch viele andere Änderungen am Aktuator. Lesen Sie daher unbedingt das Kapitel Aktuator in der offiziellen Dokumentation durch! https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready.html Ich möchte einen Kommentar-Blog darüber schreiben ... nun, bitte warten Sie geduldig!
Recommended Posts