Spring Security - Personalizza la pagina 403 Vietato / Accesso negato

1. Introduzione

In questo articolo, mostreremo come personalizzare la pagina di accesso negato in un progetto Spring Security .

Ciò può essere ottenuto tramite la configurazione Spring Security o la configurazione dell'applicazione web nel file web.xml .

Nelle restanti sezioni daremo uno sguardo più approfondito a ciascuna di queste opzioni.

2. JSP personalizzato

Ogni volta che un utente tenta di accedere a una pagina che è limitata a ruoli che non ha, l'applicazione restituirà un codice di stato 403, che significa Accesso negato .

Per sostituire la pagina di risposta dello stato Spring 403 con una personalizzata, creiamo prima un file JSP chiamato accessDenied.jsp :

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

Click here to go back to the Homepage.

3. Configurazione Spring Security

Per impostazione predefinita, Spring Security ha definito un ExceptionTranslationFilter che gestisce le eccezioni di tipo AuthenticationException e AccessDeniedException . Quest'ultimo viene eseguito tramite una proprietà chiamata accessDeniedHandler, che utilizza la classe AccessDeniedHandlerImpl .

Per personalizzare questo comportamento per utilizzare la nostra pagina che abbiamo creato sopra, dobbiamo sovrascrivere le proprietà della classe ExceptionTranslationFilter . Questa operazione può essere eseguita tramite la configurazione Java o la configurazione XML.

3.1. Accesso negato alla pagina

Usando Java, possiamo personalizzare il processo di movimentazione 403 errore utilizzando l'accessDeniedPage () o accessDeniedHandler () metodi durante la configurazione del HttpSecurity elemento.

Creiamo una configurazione di autenticazione che limita gli URL "/ admin / ** " al ruolo ADMIN e imposta la pagina di accesso negato alla nostra pagina accessDenied.jsp personalizzata :

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

Diamo un'occhiata alla configurazione XML equivalente per la pagina di accesso negato:

3.2. Gestore accesso negato

L'uso di un gestore di accesso negato invece di una pagina ha il vantaggio di poter definire una logica personalizzata da eseguire prima di reindirizzare alla pagina 403. Per questo, dobbiamo creare una classe che implementi l' interfaccia AccessDeniedHandler e sovrascriva il metodo handle () .

Creiamo una classe AccessDeniedHandler personalizzata che registra un messaggio di avviso per ogni tentativo di accesso negato contenente l'utente che ha effettuato il tentativo e l'URL protetto a cui stavano tentando di accedere:

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"); } }

Nella configurazione di sicurezza, definiremo il bean e imposteremo l' AccessDeniedHandler personalizzato :

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

Se vogliamo configurare la classe CustomAccessDeniedHandler definita sopra utilizzando XML, la configurazione apparirà leggermente diversa:

4. Configurazione dell'applicazione

La gestione dell'errore di accesso negato può essere eseguita tramite il file web.xml di un'applicazione web, definendo un tag della pagina di errore . Questo contiene due sottotag chiamati codice di errore, che specifica il codice di stato da intercettare e la posizione, che indica l'URL a cui l'utente verrà reindirizzato nel caso in cui venga rilevato il codice di errore:

 403 /accessDenied 

Se un'applicazione non dispone di un file web.xml , come nel caso di Spring Boot, le annotazioni Spring non forniscono attualmente un'alternativa esatta al tag della pagina di errore . Secondo la documentazione di Spring, in questo caso, l'approccio consigliato consiste nell'usare i metodi accessDeniedPage () e accessDeniedHandler () presentati nella sezione 3.

5. conclusione

In questo rapido articolo, abbiamo dettagliato i vari modi in cui un errore di accesso negato può essere gestito utilizzando una pagina 403 personalizzata.

Il codice sorgente completo dell'articolo può essere trovato nel progetto GitHub.