Frühlingssicherheit mit Thymeleaf

Frühlingssicherheit mit Thymeleaf

1. Überblick

In this quick tutorial, we’ll focus on Spring Security with Thymeleaf. Wir werden eine Spring Boot-Anwendung erstellen, in der wir die Verwendung des Sicherheitsdialekts demonstrieren.

Unsere Wahl für die Frontend-Technologie istThymeleaf - eine moderne serverseitige Web-Template-Engine mit guter Integration in das Spring MVC-Framework. Weitere Informationen finden Sie in unserenintro article.

Schließlich ist der Spring Security Dialect ein Thymeleaf-Zusatzmodul, das natürlich dazu beiträgt, beides miteinander zu integrieren.

Wir werden das einfache Projekt verwenden, das wir in unserem ArtikelSpring Boot tutorialerstellt haben. Wir haben auch einThymeleaf tutorial with Spring, wo die Standard-Thymeleaf-Konfiguration gefunden werden kann.

2. Abhängigkeiten

Fügen wir zunächst die neue Abhängigkeit zu unseren Mavenpom.xmlhinzu:


    org.thymeleaf.extras
    thymeleaf-extras-springsecurity4

Es wird empfohlen, immer die neueste Version zu verwenden - die wir beiMaven Central überwinden können.

3. Spring-Sicherheitskonfiguration

Als Nächstes definieren wir die Konfiguration für Spring Security.

Wir benötigen außerdem mindestens zwei verschiedene Benutzer, um die Verwendung des Sicherheits-Dialekts zu demonstrieren:

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    // [...]
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth)
      throws Exception {
        auth
          .inMemoryAuthentication()
          .withUser("user").password(passwordEncoder().encode("password")).roles("USER")
          .and()
          .withUser("admin").password(passwordEncoder().encode("admin")).roles("ADMIN");
    }

    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

Wie wir sehen können, definieren wir inconfigureGlobal(AuthenticationManagerBuilder auth) zwei Benutzer mit Benutzername und Passwort. Wir können diese verwenden, um auf unsere Anwendung zuzugreifen.

Unsere Benutzer haben unterschiedliche Rollen:ADMIN bzw.USER, damit wir ihnen spezifische Inhalte basierend auf einer Rolle präsentieren können.

4. Sicherheitsdialekt

The Spring Security dialect allows us to conditionally display content based on user roles, permissions or other security expressions. Es gibt uns auch Zugriff auf das SpringAuthentication-Objekt.

Schauen wir uns die Indexseite an, die Beispiele für Sicherheitsdialekt enthält:



    
        Welcome to Spring Security Thymeleaf tutorial
    
    
        

Welcome

Spring Security Thymeleaf tutorial

Text visible to user.
Text visible to admin.
Text visible only to authenticated users.
Authenticated username:
Authenticated user roles:

Wir können die Attribute sehen, die für den Spring Security Dialect spezifisch sind:sec:authorize undsec:authentication.

Lassen Sie uns diese nacheinander diskutieren.

4.1. sec:authorize verstehen

Einfach ausgedrückt, verwenden wir das Attributsec:authorize, um den angezeigten Inhalt zu steuern.

Wenn wir beispielsweise nur einem Benutzer mit der Rolle USER Inhalte anzeigen möchten, können wir Folgendes tun:<div sec:authorize=”hasRole(‘USER')”>.

Und wenn wir den Zugriff auf alle authentifizierten Benutzer erweitern möchten, können wir den folgenden Ausdruck verwenden:

.

4.2. sec:authentication verstehen

Die Schnittstelle von Spring SecurityAuthenticationtellt nützliche Methoden für den authentifizierten Principal oder die Authentifizierungsanforderung bereit.

Füraccess an authentication object withing Thymeleaf können wir einfach<div sec:authentication=”name”> oder<div sec:authentication=”principal.authorities”>. verwenden

Ersteres ermöglicht uns den Zugriff auf den Namen des authentifizierten Benutzers, letzteres ermöglicht uns den Zugriff auf die Rollen des authentifizierten Benutzers.

5. Zusammenfassung

In diesem Artikel haben wir die Spring Security-Unterstützung in Thymeleaf in einer einfachen Spring Boot-Anwendung verwendet.

Wie immer ist eine funktionierende Version des in diesem Artikel gezeigten Codes in unserenGitHub repository verfügbar.