Spring Security: Personnalisez la page d’accès refusé à 403

Spring Security: Personnalisez la page d'accès refusé 403

Dans Spring Security, si un utilisateur non autorisé essaie d'accéder à une page protégée, un «http 403 access denied» par défaut s'affiche:

spring-security-403-default

Dans ce didacticiel, nous allons vous montrer comment personnaliser la page 403 d'accès refusé dans Spring Security.

1. Configuration de sécurité de printemps

Passez en revue une configuration, si «alex» essaie d'accéder à la page/admin, au-dessus de 403 la page d'accès refusé sera affichée.

Spring-Security.xml

  
    
    
  

  
    
      
        
        
      
    
  

2. Solution - Personnaliser la page 403

2.1 Create a new 403 page.

403.jsp



    

HTTP Status 403 - Access is denied

${msg}

2.2. Pour afficher la page ci-dessus, ajoutez unerror-page comme suit:

Spring-Security.xml

    
        
        
    

2.3 In a controller class, add a mapping for “/403” url :

HelloController.java

package com.example.web.controller;

import java.security.Principal;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class HelloController {

    // for 403 access denied page
    @RequestMapping(value = "/403", method = RequestMethod.GET)
    public ModelAndView accesssDenied(Principal user) {

        ModelAndView model = new ModelAndView();

        if (user != null) {
            model.addObject("msg", "Hi " + user.getName()
            + ", you do not have permission to access this page!");
        } else {
            model.addObject("msg",
            "You do not have permission to access this page!");
        }

        model.setViewName("403");
        return model;

    }

}

Terminé.

Pour les utilisateurs d'annotations, utilisez ce.exceptionHandling().accessDeniedPage("/403").

SecurityConfig.java

package com.example.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {

     http.authorizeRequests()
        .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
        .and().formLogin()
        .loginPage("/login").failureUrl("/login?error")
        .usernameParameter("username")
        .passwordParameter("password")
        .and().logout().logoutSuccessUrl("/login?logout")
        .and()
        .exceptionHandling().accessDeniedPage("/403")
    }
}

3. AccessDeniedHandler

De plus, vous pouvez créer unAccessDeniedHandler personnalisé pour exécuter certaines logiques métier avant de transmettre l'URL au mappage/403.

MyAccessDeniedHandler.java

package com.example.web.exception;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.web.access.AccessDeniedHandler;

public class MyAccessDeniedHandler implements AccessDeniedHandler {

    private String errorPage;

    public MyAccessDeniedHandler() {
    }

    public MyAccessDeniedHandler(String errorPage) {
        this.errorPage = errorPage;
    }

    public String getErrorPage() {
        return errorPage;
    }

    public void setErrorPage(String errorPage) {
        this.errorPage = errorPage;
    }

    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response,
        AccessDeniedException accessDeniedException)
                throws IOException, ServletException {

        //do some business logic, then redirect to errorPage url
        response.sendRedirect(errorPage);

    }

}

Ajoutez unref à la balise http.

Spring-Security.xml

    
        
        
    

    
        
    

Terminé.

4. Demo

Lorsque «alex» essaie d'accéder à la page/admin, la page de personnalisation de l'accès refusé 403 ci-dessus s'affiche.

4.1 If using error-page, url will be displayed like this :

spring-security-403-example1

4.2 If using custom access denied handler ref, url will be displayed like this :

spring-security-403-example2

Télécharger le code source

Téléchargez-le -spring-security-403-access-denied.zip (26 Ko)