Ich habe eine Webseite mit einem sicheren Formular erstellt, indem ich auf das offizielle Spring Boot-Tutorial (Schutz von Webanwendungen (https://spring.io/guides/gs/securing-web/)) verwiesen habe.
Maven 3.6.3 (OK für Maven 3.2 oder höher) Betriebssystem: macOS Mojave Version 10.14.6 Texteditor: VSCode Java: 11.0.2
Öffnen Sie Spring Initializr und erstellen Sie eine Grundlage mit den folgenden Inhalten.
Dieses Mal werden wir "Spring Web" und "Thymeleaf" als Abhängigkeiten hinzufügen.
Entpacken Sie die resultierende Zip-Datei und öffnen Sie sie in einem Editor.
Lassen Sie uns pom.xml überprüfen. Der Inhalt der automatisch erstellten POM-Datei lautet wie folgt.
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>securing-web</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>securing-web</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Lassen Sie uns zunächst eine Web-App erstellen, die durch nichts geschützt ist. Die Struktur ist so einfach wie die Anzeige des Startbildschirms und "Hallo Welt".
Erstellen Sie auf dem Startbildschirm. Erstellen Sie eine home.html-Datei unter src / main / resources / templates. Der Inhalt ist wie folgt.
home.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org" xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
<title>Spring Security Example</title>
</head>
<body>
<h1>Welcome!</h1>
<p>Click <a th:href="@{/hello}">here</a> to see a greeting.</p>
</body>
</html>
Erstellen Sie als Nächstes einen Hallo-Bildschirm. Erstellen Sie eine hello.html-Datei unter src / main / resources / templates. Der Inhalt ist wie folgt.
hello.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org"
xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
<title>Hello World!</title>
</head>
<body>
<h1>Hello world!</h1>
</body>
</html>
Mit Ausnahme des HTML-Tags handelt es sich um eine normale HTML-Datei. Dies wird bei der Implementierung der Sicherheit erneut bearbeitet.
Erstellen Sie als Nächstes eine MvcConfig.java-Datei unter src / main / java / com / example / securingweb. Der Inhalt ist wie folgt.
MvcConfig.java
package com.example.securingweb;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class MvcConfig implements WebMvcConfigurer {
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/home").setViewName("home");
registry.addViewController("/").setViewName("home");
registry.addViewController("/hello").setViewName("hello");
registry.addViewController("/login").setViewName("login");
}
}
Die von der MvcConfig-Klasse geerbte WebMvcConfigurer-Klasse überschreibt die addViewControllers-Methode. Wenn Sie also eine solche Config-Klasse erstellen, können Sie die MVC-Konfiguration realisieren, ohne einen Controller zu erstellen.
Mit @Configuration können Sie verschiedene Einstellungen für Spring konfigurieren. Fügen Sie in der Konfigurationsklasse der Klasse @Configuration hinzu.
Lassen Sie uns nun die App ausführen. Derzeit ist nichts sicher.
Führen Sie den folgenden Befehl aus.
./mvnw spring-boot:run
Versuchen Sie nach dem Start, http: // localhost: 8080 / hello in Ihrem Browser zu öffnen. Sie sollten zum Hallo-Bildschirm gelangen, ohne sich anzumelden.
Lassen Sie uns nun verhindern, dass Benutzer, die nicht angemeldet sind, den Hallo-Bildschirm anzeigen.
Wenn der Benutzer mit den aktuellen Spezifikationen auf den Link auf dem Startbildschirm klickt, wird sofort der Hallo-Bildschirm aufgerufen. Verwenden Sie Spring Security, um dies so zu ändern, dass es erst nach der Anmeldung angezeigt wird.
Fügen Sie der POM-Datei die folgenden Abhängigkeiten hinzu.
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
Erstellen Sie als Nächstes eine WebSecurityConfig.java-Datei unter src / main / java / com / example / securingweb mit den folgenden Inhalten.
WebSecurityConfig.java
package com.example.securingweb;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
// "/", "/home"Ist für alle Benutzer zugänglich
.antMatchers("/", "/home").permitAll()
//Für andere Zugriffe ist eine Authentifizierung erforderlich
.anyRequest().authenticated()
.and()
//Alle Benutzer können auf Login und Logout zugreifen
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
@Bean
@Override
public UserDetailsService userDetailsService() {
UserDetails user =
//Geben Sie den Standardbenutzernamen und das Standardkennwort an
User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
}
@EnableWebSecurity Es ist eine Anmerkung, die die Sicherheitsfunktion verwenden kann.
permitAll() Eine Methode, die allen Benutzern den Zugriff ermöglicht. Im Gegenteil, es erlaubt keinen anonymen Zugriff.
authenticated() Dies ist eine Methode zum Anfordern der Authentifizierung.
UserDetailsService überschreibt die UserDetailsService-Klasse, um Benutzereinstellungen anzugeben.
Jetzt kann nur der angemeldete Benutzer zum Hallo-Bildschirm wechseln.
Erstellen Sie als Nächstes eine Anmeldeseite. Erstellen Sie eine login.html-Datei unter src / main / resources / templates.
login.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org"
xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
<title>Spring Security Example </title>
</head>
<body>
<div th:if="${param.error}">
Invalid username and password.
</div>
<div th:if="${param.logout}">
You have been logged out.
</div>
<form th:action="@{/login}" method="post">
<div><label> User Name : <input type="text" name="username"/> </label></div>
<div><label> Password: <input type="password" name="password"/> </label></div>
<div><input type="submit" value="Sign In"/></div>
</form>
</body>
</html>
$ {param.error} und $ {param.logout} erhalten die Fehler- und Abmeldeparameter. Wenn der Fehler wahr ist, wird eine Fehlermeldung angezeigt, und wenn die Abmeldung wahr ist, wird eine Abmeldemeldung angezeigt.
Zeigen Sie abschließend Ihren aktuellen Benutzernamen an, damit Sie sich abmelden können. Begrüßen Sie dazu den aktuellen Benutzer in hello.html und lassen Sie ihn das Abmeldeformular anzeigen.
Bearbeiten Sie nun hello.html mit den folgenden Inhalten.
hello.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org"
xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
<title>Hello World!</title>
</head>
<body>
<h1 th:inline="text">Hello
//Holen Sie sich den Benutzernamen und zeigen Sie ihn auf dem Bildschirm an
[[${#httpServletRequest.remoteUser}]]!</h1>
<form th:action="@{/logout}" method="post">
<input type="submit" value="Sign Out"/>
</form>
</body>
</html>
Das Abmeldeformular wird an / logout gesendet. Wenn Sie sich abmelden, werden Sie zu / login? Logout weitergeleitet.
Fügen Sie abschließend ein wenig zu SecuringWebApplication.java hinzu, um die App auszuführen. Bearbeiten Sie SecuringWebApplication.java unter src / main / java / com / example / securingweb mit den folgenden Inhalten.
SecuringWebApplication.java
package com.example.securingweb;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SecuringWebApplication {
public static void main(String[] args) throws Throwable {
SpringApplication.run(SecuringWebApplication.class, args);
}
}
Versuchen Sie, die App mit dem folgenden Befehl zu starten.
./mvnw spring-boot:run
Öffnen Sie nach dem Start http: // localhost: 8080.
Klicken Sie auf den Link, um zur ersten Seite zu gelangen.
Klicken Sie hier, um zum Anmeldebildschirm zu gelangen.
Geben Sie "Benutzer" in Benutzername und "Passwort" in Passwort ein.
Ich konnte mich einloggen.
Wenn Sie für Benutzername und Passwort unterschiedliche eingeben, wird es ordnungsgemäß abgespielt.
Klicken Sie auf die Schaltfläche Abmelden, um Ihre Authentifizierung zu widerrufen und mit einer Abmeldemeldung zur Anmeldeseite zurückzukehren.
Recommended Posts