Spring Security - Personalize a página 403 Proibido/Acesso Negado

Spring Security - Personalize a página 403 Proibido / Acesso Negado

1. Introdução

Neste artigo, mostraremos comocustomize the access denied page in a Spring Security project.

Isso pode ser obtido por meio da configuração do Spring Security ou da configuração do aplicativo da web no arquivoweb.xml.

Nas seções restantes, examinaremos mais profundamente cada uma dessas opções.

2. JSP personalizado

Sempre que um usuário tentar acessar uma página restrita a funções que ele não possui, o aplicativo retornará o código de status 403, que significaAccess Denied.

Para substituir a página de resposta de status do Spring 403 por uma personalizada,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. Configuração de segurança da primavera

Por padrão, o Spring Security tem umExceptionTranslationFilter definido que trata as exceções do tipoAuthenticationExceptioneAccessDeniedException. O último é feito por meio de uma propriedade chamadaaccessDeniedHandler, que usa a classeAccessDeniedHandlerImpl.

Para personalizar esse comportamento para usar nossa própria página que criamos acima, precisamos substituir as propriedades da classeExceptionTranslationFilter. Isso pode ser feito através da configuração Java ou XML.

3.1. Página de acesso negado

Usando Java,we can customize the 403 error handling process by using the accessDeniedPage() or accessDeniedHandler() methods ao configurar o elementoHttpSecurity.

Vamos criar uma configuração de autenticação que restrinja os URLs“/admin/** ”à funçãoADMIN e defina a página de acesso negado para nossa páginaaccessDenied.jsp personalizada:

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

Vamos dar uma olhada na configuração XML equivalente para a página de acesso negado:


    
 

3.2. Manipulador de acesso negado

O uso de um manipulador de acesso negado em vez de uma página tem a vantagem de podermos definir a lógica personalizada a ser executada antes de redirecionar para a página 403. Para isso,we need to create a class that implements the AccessDeniedHandler interfacee substitui o métodohandle().

Vamos criar uma classeAccessDeniedHandler personalizada que registra uma mensagem de aviso para cada tentativa de acesso negado contendo o usuário que fez a tentativa e o URL protegido que ele estava tentando acessar:

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

Na configuração de segurança,we’ll define the bean and set the custom AccessDeniedHandler:

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

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

Se quisermos configurar a classeCustomAccessDeniedHandler definida acima usando XML, a configuração será um pouco diferente:




    

4. Configuração da Aplicação

Handling the access denied error can be done through the web.xml file of a web application, by defining an error-page tag. Isso contém duas subtags chamadaserror-code, que especifica o código de status a ser interceptado elocation, que significa a URL para a qual o usuário será redirecionado caso o código de erro seja encontrado:


    403
    /accessDenied

Se um aplicativo não tiver um arquivoweb.xml, como é o caso do Spring Boot, as anotações do Spring atualmente não fornecem uma alternativa exata para a tagerror-page. De acordo com a documentação do Spring, neste caso, a abordagem recomendada é usar os métodosaccessDeniedPage()eaccessDeniedHandler() apresentados na seção 3.

5. Conclusão

Neste artigo rápido, detalhamos as várias maneiras pelas quais um erro de acesso negado pode ser tratado usando uma página 403 personalizada.

O código-fonte completo do artigo pode ser encontrado emGitHub project.