Frühlingssicherheit - Passen Sie die Seite 403 Verboten / Zugriff verweigert an

1. Einleitung

In diesem Artikel wird gezeigt, wie Sie die Seite mit verweigertem Zugriff in einem Spring Security-Projekt anpassen .

Dies kann entweder über die Spring Security-Konfiguration oder die Webanwendungskonfiguration in der Datei web.xml erreicht werden.

In den verbleibenden Abschnitten werden wir uns jede dieser Optionen genauer ansehen.

2. Benutzerdefinierte JSP

Wenn ein Benutzer versucht, auf eine Seite zuzugreifen, die auf Rollen beschränkt ist, die er nicht hat, gibt die Anwendung den Statuscode 403 zurück, was bedeutet, dass der Zugriff verweigert wird .

Um die Antwortantwortseite für den Spring 403-Status durch eine benutzerdefinierte zu ersetzen, erstellen wir zunächst eine JSP- Datei mit dem Namen accessDenied.jsp :

Sorry, you do not have permission to view this page.

Click here to go back to the Homepage.

3. Spring Security-Konfiguration

Standardmäßig ist in Spring Security ein ExceptionTranslationFilter definiert, der Ausnahmen vom Typ AuthenticationException und AccessDeniedException behandelt . Letzteres erfolgt über eine Eigenschaft namens accessDeniedHandler, die die AccessDeniedHandlerImpl- Klasse verwendet.

Um dieses Verhalten so anzupassen, dass unsere eigene Seite verwendet wird, die wir oben erstellt haben, müssen wir die Eigenschaften der ExceptionTranslationFilter- Klasse überschreiben . Dies kann entweder über die Java-Konfiguration oder die XML-Konfiguration erfolgen.

3.1. Zugriff auf verweigerte Seite

Mit Java können wir den 403-Fehlerbehandlungsprozess mithilfe der Methoden accessDeniedPage () oder accessDeniedHandler () anpassen , während wir das HttpSecurity- Element konfigurieren .

Erstellen wir eine Authentifizierungskonfiguration, die die URLs "/ admin / ** " auf die ADMIN- Rolle beschränkt und die Seite "Zugriff verweigert" auf unsere benutzerdefinierte Seite " accessDenied.jsp" festlegt :

@Override protected void configure(final HttpSecurity http) throws Exception { http // ... .and() .exceptionHandling().accessDeniedPage("/accessDenied.jsp"); }

Werfen wir einen Blick auf die entsprechende XML-Konfiguration für die Seite "Zugriff verweigert":

3.2. Zugriff verweigert Handler

Die Verwendung eines Handlers für den Zugriff verweigert anstelle einer Seite hat den Vorteil, dass wir eine benutzerdefinierte Logik definieren können, die ausgeführt werden soll, bevor auf die 403-Seite umgeleitet wird. Dazu müssen wir eine Klasse erstellen, die die AccessDeniedHandler- Schnittstelle implementiert und die handle () -Methode überschreibt .

Erstellen wir eine benutzerdefinierte AccessDeniedHandler- Klasse, die eine Warnmeldung für jeden versuchten Zugriffsversuch protokolliert, die den Benutzer, der den Versuch ausgeführt hat, und die geschützte URL enthält, auf die sie zugreifen wollten :

public class CustomAccessDeniedHandler implements AccessDeniedHandler { public static final Logger LOG = Logger.getLogger(CustomAccessDeniedHandler.class); @Override public void handle( HttpServletRequest request, HttpServletResponse response, AccessDeniedException exc) throws IOException, ServletException { Authentication auth = SecurityContextHolder.getContext().getAuthentication(); if (auth != null) { LOG.warn("User: " + auth.getName() + " attempted to access the protected URL: " + request.getRequestURI()); } response.sendRedirect(request.getContextPath() + "/accessDenied"); } }

In der Sicherheitskonfiguration definieren wir die Bean und legen den benutzerdefinierten AccessDeniedHandler fest :

@Bean public AccessDeniedHandler accessDeniedHandler(){ return new CustomAccessDeniedHandler(); } //... .exceptionHandling().accessDeniedHandler(accessDeniedHandler()); 

Wenn wir die oben definierte CustomAccessDeniedHandler- Klasse mithilfe von XML konfigurieren möchten, sieht die Konfiguration etwas anders aus:

4. Anwendungskonfiguration

Die Behandlung des Fehlers, dem der Zugriff verweigert wurde, kann über die Datei web.xml einer Webanwendung erfolgen, indem ein Fehlerseiten- Tag definiert wird. Diese enthält zwei Untertags, den Fehlercode, der den abzufangenden Statuscode angibt, und den Speicherort, der die URL angibt , zu der der Benutzer umgeleitet wird, falls der Fehlercode auftritt:

 403 /accessDenied 

Wenn eine Anwendung keine web.xml- Datei hat, wie dies bei Spring Boot der Fall ist, bieten die Spring-Anmerkungen derzeit keine genaue Alternative zum Fehlerseiten- Tag. Gemäß der Spring-Dokumentation wird in diesem Fall empfohlen, die in Abschnitt 3 vorgestellten Methoden accessDeniedPage () und accessDeniedHandler () zu verwenden .

5. Schlussfolgerung

In diesem kurzen Artikel haben wir die verschiedenen Möglichkeiten beschrieben, wie ein Fehler, dem der Zugriff verweigert wurde, mithilfe einer benutzerdefinierten 403-Seite behandelt werden kann.

Den vollständigen Quellcode des Artikels finden Sie im GitHub-Projekt.