Spring Security Expressions - hasRole-Beispiel

Spring Security Expressions - hasRole Beispiel

1. Überblick

Spring Security bietet eine Vielzahl von Ausdrücken mit der leistungsstarken Spring Expression Language (SpEL). Die meisten dieser Sicherheitsausdrücke werden anhand eines Kontextobjekts ausgewertet -the currently authenticated principal.

Die Auswertung dieser Ausdrücke erfolgt durchSecurityExpressionRoot - dies bildet die Grundlage sowohl für die Web-Sicherheit als auch für die Sicherheit auf Methodenebene.

Die Möglichkeit,SpEL Ausdrücke als Autorisierungsmechanismus zu verwenden, wurde in Spring Security 3.0 eingeführt und wird in Spring Security 4.x fortgesetzt. Eine umfassende Liste der Ausdrücke in Spring Security finden Sie unterthis guide.

Weitere Lektüre:

Frühlingssicherheit mit Thymeleaf

Eine Kurzanleitung zur Integration von Spring Security und Thymeleaf

Read more

Einführung in die Spring-Methodensicherheit

Eine Anleitung zur Sicherheit auf Methodenebene mit dem Spring Security Framework.

Read more

Zwei-Faktor-Authentifizierung mit Frühlingssicherheit

Eine praktische Zwei-Faktor-Authentifizierungsimplementierung mit Spring Security 4 und der mobilen Google Authenticator-App.

Read more

2. Webautorisierung

Spring Security bietet zwei Arten der Webautorisierung: Sichern vonfull page based on the URL und bedingtes Anzeigen vonparts of a JSP page basierend auf Sicherheitsregeln.

2.1. Beispiel für eine ganzseitige Autorisierung

Wenn Ausdrücke für das Elementhttpaktiviert sind, kann ein URL-Muster wie folgt gesichert werden:


    
    ...

Verwenden der Java-Konfiguration:

@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
          .authorizeRequests()
          .antMatchers("/admin/**").hasRole("ADMIN");
    }
    ...
}

Spring Security stellt jeder Rolle automatischROLE_ voran.

Der AusdruckhasRolewird hier verwendet, um zu überprüfen, ob der aktuell authentifizierte Principal die angegebene Berechtigung hat.

2.2. Im Beispiel für die Seitenautorisierung

Bei der zweiten Art der Webautorisierung wird ein Teil einer JSP-Seite basierend auf der Bewertung eines Sicherheitsausdrucks bedingt angezeigt.

Addieren wir die erforderlichendependency fürSpring Security JSP taglib support inpom.xml:


    org.springframework.security
    spring-security-taglibs
    5.0.5.RELEASE

Die Unterstützung vontaglibmuss auf der Seite aktiviert sein, damit der Namespace vonsecurityverwendet werden kann:

<%@ taglib prefix="security"
  uri="http://www.springframework.org/security/tags" %>

Der AusdruckhasRolekann jetzt auf der Seite verwendet werden, um HTML-Elemente basierend auf der Person anzuzeigen / auszublenden, die derzeit beim Rendern der Seite authentifiziert ist:


    This text is only visible to a user
    
This text is only visible to an admin

3. Autorisierungsbeispiel auf Methodenebene -@PreAuthorize

Sicherheitsausdrücke können verwendet werden, um die Geschäftsfunktionalität auch auf Methodenebene mithilfe von Anmerkungen zu sichern.

Die Anmerkungen@PreAuthorize und@PostAuthorize (sowie@PreFilter und@PostFilter) unterstützen die Spring Expression Language (SpEL) und bieten eine ausdrucksbasierte Zugriffssteuerung.

Um die Sicherheit auf Methodenebene zu verwenden, müssen wir dies zunächst in der Sicherheitskonfiguration mit@EnableGlobalMethodSecurity: aktivieren

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

Die entsprechende XML-Konfiguration:

Dann können wir Methoden mithilfe der Annotation von Spring@PreAuthorizeichern:

@Service
public class FooService {
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    public List findAll() { ... }
    ...
}

Jetzt können nur Principals mit ADMIN-Rolle die MethodefindAllerfolgreich aufrufen.

Beachten Sie, dassthe Pre and Post annotations are evaluated and enforced via proxies - falls CGLIB-Proxys verwendet werden, dürfen die Klasse und die öffentlichen Methoden nicht alsfinal deklariert werden.

4. Programmatische Überprüfung der Rolle

Eine Benutzerberechtigung kann auch programmgesteuert in Java-Rohcode überprüft werden, wenn das Objektrequestverfügbar ist:

@RequestMapping
public void someControllerMethod(HttpServletRequest request) {
    request.isUserInRole("someAuthority");
}

Ohne Zugriff aufrequest kann die Überprüfung natürlich auch manuell durchgeführt werden, indem einfach überprüft wird, ob der aktuell authentifizierte Benutzer über diese bestimmte Berechtigung verfügt. The user can be obtained aus dem Spring Security-Kontext auf verschiedene Weise.

5. Fazit

Dieses Tutorial ist eine kurze Einführung in die Verwendung von Spring Security Expressions im Allgemeinen und deshasRole-Ausdrucks im Besonderen - als kurze Einführung, wie verschiedene Teile der Anwendung gesichert werden können.

Schauen Sie sich für das Beispiel für die Webautorisierungthis Github simple tutorial an. Das Sicherheitsbeispiel auf Methodenebene lautet ebenfallson GitHub.