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:
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.