tag lib form spring spring-security spring-boot spring-annotations spring-security-oauth2

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