spring - form - tag lib jstl
Pre-autorizar el manejo de errores (2)
Implementar AccessDeniedHandler
@Override
public void handle(HttpServletRequest request, HttpServletResponse response,
AccessDeniedException accessDeniedException) throws IOException, ServletException {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
try {
ObjectMapper mapper = new ObjectMapper();
SomeJsonModel jsonResponse =new SomeJsonModel();
mapper.writeValue(response.getOutputStream(), jsonResponse);
} catch (Exception e) {
throw new ServletException();
}
}
SomeJsonModel será su propia clase de modelo / POJO que puede controlar Y agregar ese controlador de acceso denegado en la Configuración del servidor de recursos
`
@Override
public void configure(HttpSecurity http) throws Exception {
http.requestMatchers()
.antMatchers(SECURED_PATTERN).and().authorizeRequests()
.antMatchers(HttpMethod.POST,SECURED_PATTERN).access(SECURED_WRITE_SCOPE)
.anyRequest().access(SECURED_READ_SCOPE).and()
.exceptionHandling().authenticationEntryPoint(newAuthExceptionEntryPoint())
.accessDeniedHandler(new MyAccessDeniedHandler());
}
`
Estoy usando Spring Oauth2
y Spring Pre-post Annotations
con Spring-boot
Tengo una clase de servicio MyService
. Uno de los métodos de MyService
es:
@PreAuthorize("#id.equals(authentication.principal.id)")
public SomeResponse getExampleResponse(String id){...}
¿Puedo controlar de alguna manera el json que devuelve el Controlador que llama?
El json que se devuelve por defecto es:
{error : "access_denied" , error_message: ".."}
Quiero poder controlar el error_message
param. Estoy buscando algo similar a:
@PreAuthorize(value ="#id.equals(authentication.principal.id)", onError ="throw new SomeException("bad params")")
public SomeResponse getExampleResponse(String id){...}
Una forma en que pensé hacerlo es mediante el uso de ExceptionHandler
@ExceptionHandler(AccessDeniedException.class)
public Response handleAccessDeniedException(Exception ex, HttpServletRequest request){
...
}
pero no puedo controlar el message
de la excepción. y tampoco puedo estar seguro de que esta Exception
se lance en futuras versiones
Spring Boot docs en el manejo de errores: http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-error-handling . Una forma de controlar JSON es agregar un @Bean
de tipo ErrorAttributes
.
@Bean
ErrorAttributes errorAttributes() {
return new MyErrorAttributes();
}