Spring Security - Personnalisez la page 403 Interdit/Accès refusé

Spring Security - Personnalisez la page 403 Interdit / Accès refusé

1. introduction

Dans cet article, nous allons montrer commentcustomize the access denied page in a Spring Security project.

Cela peut être réalisé via la configuration de Spring Security ou la configuration de l'application Web dans le fichierweb.xml.

Dans les sections restantes, nous examinerons plus en profondeur chacune de ces options.

2. JSP personnalisé

Chaque fois qu'un utilisateur tente d'accéder à une page qui est limitée aux rôles qu'il n'a pas, l'application renvoie un code d'état 403, ce qui signifieAccess Denied.

Afin de remplacer la page de réponse d'état Spring 403 par une page personnalisée,let’s first create a JSP file called accessDenied.jsp:


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

Click ">here to go back to the Homepage.

3. Configuration de sécurité de printemps

Par défaut, Spring Security a défini unExceptionTranslationFilter qui gère les exceptions de typeAuthenticationException etAccessDeniedException. Cette dernière se fait via une propriété appeléeaccessDeniedHandler, qui utilise la classeAccessDeniedHandlerImpl.

Afin de personnaliser ce comportement pour utiliser notre propre page que nous avons créée ci-dessus, nous devons remplacer les propriétés de la classeExceptionTranslationFilter. Cela peut être effectué via la configuration Java ou la configuration XML.

3.1. Page d'accès refusé

En utilisant Java,we can customize the 403 error handling process by using the accessDeniedPage() or accessDeniedHandler() methods lors de la configuration de l'élémentHttpSecurity.

Créons une configuration d'authentification qui restreint les URL de“/admin/** au rôleADMIN et définit la page d'accès refusé à notre pageaccessDenied.jsp personnalisée:

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

Jetons un coup d'œil à la configuration XML équivalente pour la page d'accès refusé:


    
 

3.2. Gestionnaire d'accès refusé

L'utilisation d'un gestionnaire d'accès refusé à la place d'une page offre l'avantage de pouvoir définir une logique personnalisée à exécuter avant la redirection vers la page 403. Pour cela,we need to create a class that implements the AccessDeniedHandler interface et remplace la méthodehandle().

Créons une classeAccessDeniedHandler personnalisée qui consigne un message d’avertissement pour chaque tentative d’accès refusé contenant l’utilisateur qui a effectué la tentative et l’URL protégée à laquelle il tentait d’accéder:

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

Dans la configuration de sécurité,we’ll define the bean and set the custom AccessDeniedHandler:

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

//...
.exceptionHandling().accessDeniedHandler(accessDeniedHandler());

Si nous voulons configurer la classeCustomAccessDeniedHandler définie ci-dessus en utilisant XML, la configuration sera légèrement différente:




    

4. Configuration d'application

Handling the access denied error can be done through the web.xml file of a web application, by defining an error-page tag. Cela contient deux sous-étiquettes appeléeserror-code, qui spécifient le code d'état à intercepter, etlocation, qui signifie l'URL vers laquelle l'utilisateur sera redirigé en cas de détection du code d'erreur:


    403
    /accessDenied

Si une application n'a pas de fichierweb.xml, comme c'est le cas avec Spring Boot, les annotations Spring ne fournissent actuellement pas d'alternative exacte à la baliseerror-page. Selon la documentation de Spring, dans ce cas, l'approche recommandée est d'utiliser les méthodesaccessDeniedPage() etaccessDeniedHandler() présentées dans la section 3.

5. Conclusion

Dans cet article rapide, nous avons détaillé les différentes manières dont une erreur d'accès refusé peut être traitée à l'aide d'une page 403 personnalisée.

Le code source complet de l'article se trouve dans lesGitHub project.