Einführung zu Spring Security Expressions

Einführung in Spring Security Expressions

1. Einführung

In diesem Tutorial konzentrieren wir uns auf Spring Security Expressions und natürlich auf praktische Beispiele mit diesen Ausdrücken.

Bevor Sie sich komplexere Implementierungen (z. B. ACL) ansehen, ist es wichtig, die Sicherheitsausdrücke genau zu verstehen, da sie bei korrekter Verwendung sehr flexibel und leistungsstark sein können.

Dieser Artikel ist eine Erweiterung vonSpring Security Expressions – hasRole Example.

2. Maven-Abhängigkeiten

Um Spring Security verwenden zu können, müssen Sie den folgenden Abschnitt in Ihrepom.xml-Datei aufnehmen:


    
        org.springframework.security
        spring-security-web
        4.1.1.RELEASE
    

Die neueste Version finden Sie inhere.

Und ein kurzer Hinweis: Diese Abhängigkeit deckt nur Spring Security ab. Vergessen Sie nicht, spring-core undspring-context für eine vollständige Webanwendung hinzuzufügen.

3. Aufbau

Schauen wir uns zunächst eine Java-Konfiguration an.

Wir verlängernWebSecurityConfigurerAdapter, sodass wir die Option haben, sich in einen der Erweiterungspunkte einzuhängen, die die Basisklasse bietet:

@Configuration
@EnableAutoConfiguration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityWithoutCsrfConfig extends WebSecurityConfigurerAdapter {
    ...
}

Natürlich können wir auch eine XML-Konfiguration vornehmen:



    

4. Web-Sicherheitsausdrücke

Schauen wir uns nun die Sicherheitsausdrücke an:

  • Hasrole, Hasanyrole

  • Hasauthority, Hasanyauthority

  • Permitall, Denyall

  • Isanonymous, Isrememberme, Isauthenticated, Isfullyauthenticated

  • Prinzipal, Authentifizierung

  • hasPermission

Lassen Sie uns nun jedes dieser Elemente im Detail durchgehen.

4.1. hasRole, hasAnyRole

Diese Ausdrücke sind für die Definition der Zugriffssteuerung oder Autorisierung für bestimmte URLs oder Methoden in Ihrer Anwendung verantwortlich.

Schauen wir uns das Beispiel an:

@Override
protected void configure(final HttpSecurity http) throws Exception {
    ...
    .antMatchers("/auth/admin/*").hasRole("ADMIN")
    .antMatchers("/auth/*").hasAnyRole("ADMIN","USER")
    ...
}

In diesem Beispiel geben wir den Zugriff auf alle Links an, die mit/auth/beginnen, und sind auf Benutzer beschränkt, die mit der RolleUSERoder der RolleADMIN.angemeldet sind. Außerdem greifen wir auf Links zu, die mit/auth/admin/beginnen müssenADMIN Rolle im System haben.

Dieselbe Konfiguration kann in einer XML-Datei erreicht werden, indem Folgendes geschrieben wird:


    
    

4.2. hasAuthority, hasAnyAuthority

Rollen und Befugnisse sind im Frühjahr ähnlich.

Der Hauptunterschied besteht darin, dass Rollen eine spezielle Semantik haben. Ab Spring Security 4 wird das Präfix "ROLE_" automatisch durch eine rollenbezogene Methode hinzugefügt (sofern es noch nicht vorhanden ist).

hasAuthority(‘ROLE_ADMIN') ähnelt alsohasRole(‘ADMIN'), da das Präfix 'ROLE_' automatisch hinzugefügt wird.

Das Gute an der Verwendung von Behörden ist jedoch, dass wir das PräfixROLE_überhaupt nicht verwenden müssen.

Hier ist ein kurzes Beispiel, in dem wir Benutzer mit bestimmten Berechtigungen definieren:

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.inMemoryAuthentication()
      .withUser("user1").password("user1Pass")
      .authorities("USER")
      .and().withUser("admin").password("adminPass")
      .authorities("ADMIN");
}

Wir können dann natürlich diese Autoritätsausdrücke verwenden:

@Override
protected void configure(final HttpSecurity http) throws Exception {
    ...
    .antMatchers("/auth/admin/*").hasAuthority("ADMIN")
    .antMatchers("/auth/*").hasAnyAuthority("ADMIN", "USER")
    ...
}

Wie wir sehen können, erwähnen wir hier überhaupt keine Rollen.

Letztendlich können wir natürlich die gleiche Funktionalität auch mit der XML-Konfiguration erreichen:


    
        
            
            
        
    

And:


    
    

4.3. permitAll, denyAll

Diese beiden Anmerkungen sind auch recht einfach. Entweder erlauben wir den Zugriff auf eine URL in unserem Service oder wir verweigern den Zugriff.

Schauen wir uns das Beispiel an:

...
.antMatchers("/*").permitAll()
...

Mit dieser Konfiguration werden wir alle Benutzer (sowohl anonyme als auch angemeldete) dazu berechtigen, auf die Seite zuzugreifen, die mit "/" beginnt (z. B. unsere Homepage).

Wir können auch den Zugriff auf unseren gesamten URL-Bereich verweigern:

...
.antMatchers("/*").denyAll()
...

Dieselbe Konfiguration kann auch mit einer XML-Konfiguration durchgeführt werden:


     
     

4.4. isAnonymous, isRememberMe, isAuthenticated, isFullyAuthenticated

In diesem Unterabschnitt konzentrieren wir uns auf Ausdrücke, die sich auf den Anmeldestatus des Benutzers beziehen. Beginnen wir mit einem Benutzer, der sich nicht auf unserer Seite angemeldet hat. Indem wir in der Java-Konfiguration Folgendes festlegen, ermöglichen wir allen nicht autorisierten Benutzern den Zugriff auf unsere Hauptseite:

...
.antMatchers("/*").anonymous()
...

Dasselbe in der XML-Konfiguration:


    

Wenn wir die Website so sichern möchten, dass sich jeder, der sie verwendet, anmelden muss, müssen wir die MethodeisAuthenticated()verwenden:

...
.antMatchers("/*").authenticated()
...

oder XML-Version:


    

Darüber hinaus haben wir zwei zusätzliche Ausdrücke,isRememberMe() undisFullyAuthenticated(). Durch die Verwendung von Cookies aktiviert Spring die Erinnerungsfunktion, sodass nicht jedes Mal eine Anmeldung beim System erforderlich ist. Sie könnenmore about Remember Me here lesen.

Um Benutzern den Zugriff zu gewähren, die nur über die Funktion "Erinnere dich an mich" angemeldet wurden, können wir Folgendes verwenden:

...
.antMatchers("/*").rememberMe()
...

oder XML-Version:


    

Schließlich erfordern einige Teile unserer Dienste, dass der Benutzer erneut authentifiziert wird, auch wenn der Benutzer bereits angemeldet ist. Beispielsweise möchte der Benutzer Einstellungen oder Zahlungsinformationen ändern. Es wird natürlich empfohlen, in den sensibleren Bereichen des Systems nach manueller Authentifizierung zu fragen.

Zu diesem Zweck können wirisFullyAuthenticated() angeben, dietrue zurückgeben, wenn der Benutzer kein anonymer oder ein Erinnerungsbenutzer ist:

...
.antMatchers("/*").fullyAuthenticated()
...

oder die XML-Version:


    

4.5. principal, authentication

Diese Ausdrücke ermöglichen den Zugriff auf dasprincipal-Objekt, das den aktuell autorisierten (oder anonymen) Benutzer darstellt, und das aktuelleAuthentication-Objekt vonSecurityContext aus.

Wir können beispielsweiseprincipal verwenden, um die E-Mail, den Avatar oder andere Daten eines Benutzers zu laden, auf die der angemeldete Benutzer zugreifen kann.

Undauthentication liefert Informationen über das vollständigeAuthentication-Objekt zusammen mit den erteilten Berechtigungen.

Beide werden im folgenden Artikel ausführlicher beschrieben:Retrieve User Information in Spring Security.

4.6. hasPermission APIs

Dieser Ausdruck istdocumented und soll eine Brücke zwischen dem Ausdruckssystem und dem ACL-System von Spring Security schlagen. Auf diese Weise können wir Berechtigungsbeschränkungen für einzelne Domänenobjekte basierend auf abstrakten Berechtigungen festlegen.

Schauen wir uns ein Beispiel an. Wir haben einen Service, der kooperatives Schreiben von Artikeln mit einem Haupteditor ermöglicht, der entscheidet, welcher von anderen Autoren vorgeschlagene Artikel veröffentlicht werden soll.

Um die Nutzung eines solchen Dienstes zu ermöglichen, können wir folgende Methoden mit Zugriffskontrollmethoden erstellen:

@PreAuthorize("hasPermission(#articleId, 'isEditor')")
public void acceptArticle(Article article) {
   …
}

Nur autorisierte Benutzer können diese Methode aufrufen, und der Benutzer muss über die BerechtigungisEditor im Dienst verfügen.

Wir müssen auch daran denken,PermissionEvaluator in unserem Anwendungskontext explizit zu konfigurieren:


    



    

Dabei istcustomInterfaceImplementation die Klasse, diePermissionEvaluator. implementiert

Natürlich können wir das auch mit der Java-Konfiguration machen:

@Override
protected MethodSecurityExpressionHandler expressionHandler() {
    DefaultMethodSecurityExpressionHandler expressionHandler =
      new DefaultMethodSecurityExpressionHandler();
    expressionHandler.setPermissionEvaluator(new CustomInterfaceImplementation());
    return expressionHandler;
}

5. Fazit

Dieses Tutorial ist eine umfassende Einführung und Anleitung zu Spring Security Expressions.

Alle hier diskutierten Beispiele sind inon the GitHub project verfügbar.