18

errore che sto usando Spring Oauth2 e Spring Pre-post Annotations Con Spring-bootpre-autorizzare la manipolazione

ho una classe di servizio MyService. uno dei metodi è MyService:

@PreAuthorize("#id.equals(authentication.principal.id)") 
public SomeResponse getExampleResponse(String id){...} 

posso controllare in qualche modo il JSON che viene restituito dal chiamante controller?

il JSON restituito da default è:

{error : "access_denied" , error_message: ".."} 

voglio essere in grado di controllare il error_message param. Sto cercando qualcosa di simile a:

@PreAuthorize(value ="#id.equals(authentication.principal.id)", onError ="throw new SomeException("bad params")") 
public SomeResponse getExampleResponse(String id){...} 

Un modo ho pensato di farlo è quello di utilizzare ExceptionHandler

@ExceptionHandler(AccessDeniedException.class) 
public Response handleAccessDeniedException(Exception ex, HttpServletRequest request){ 
    ... 
} 

ma non riesco a controllare il message dell'eccezione. e anche io non posso essere sicuro che questo Exception sarà gettato nelle versioni future

+0

Il '{errore: "ACCESS_DENIED", error_message: ".."}' appare come l'uscita dal gestore degli errori predefinito Primavera di avvio. E 'quello che stai usando? –

+0

sì @DaveSyer sto usando Spring boot – royB

risposta

8

Spring Documenti di avvio sulla gestione degli errori: http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-error-handling. Un modo per controllare il JSON è aggiungere un @Bean di tipo ErrorAttributes.

@Bean 
ErrorAttributes errorAttributes() { 
    return new MyErrorAttributes(); 
} 
+1

grazie per la risposta. La parte relativa alla documentazione non è molto chiara e sarà bello avere un 'How To' su questo argomento. Metodo 'DefaultErrorAttributes':' addErrorDetail' Come posso controllare il messaggio 'Throwable error' che è passato a' ErrorAttributes'? – royB

+0

Se l'eccezione proviene da '@ PreAuthorize' non puoi controllarla molto (o almeno non riesco a capire perché vuoi). Quello che puoi fare, suppongo, è aggiungere un 'AccessDecisionManager 'personalizzato, ma non è molto mainstream. –

+3

Ciao @DaveSyer, ho la situazione '@PreAuthorize (" isAuthenticated() e principal.user.isEnabled() == true e principal.user.isConfirmed() == true ")' e voglio differire quale dei vincoli lancia una AccessDeniedException. Quindi gestirlo e lanciare la mia eccezione a seconda delle condizioni insoddisfatte. O solo quello che posso fare per scrivere il mio aspetto e gettare le eccezioni per conto mio? – InsFi