18

Używam Spring Oauth2 i Spring Pre-post Annotations Z Spring-bootbłąd pre-autoryzacji obsługi

Mam klasy usług MyService. jedną z metod jest MyService:

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

mogę kontrolować w jakiś sposób JSON, który jest zwracany przez dzwoniącego kontroler?

JSON, który jest zwracany jest domyślnie:

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

Chcę być w stanie kontrolować error_message param. Szukam czegoś podobnego do:

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

jeden sposób myślałem to zrobić jest użycie ExceptionHandler

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

ale nie mogę kontrolować message wyjątku. a także nie mogę być pewny, że ten zostanie wyrzucony w przyszłych wydaniach

+0

Opcja '{błąd: "Odmowa dostępu", error_message: ".."}' wygląda wyjście z procedury obsługi błędów domyślny Wiosna Boot. Czy to właśnie używasz? –

+0

yes @DaveSyer Używam Spring boot – royB

Odpowiedz

8

Dokumenty rozruchowe w zakresie obsługi błędów: http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-error-handling. Jednym ze sposobów kontrolowania JSON jest dodanie @Bean typu ErrorAttributes.

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

dzięki za odpowiedź. Część dokumentacji nie jest zbyt jasna i świetnie będzie mieć "How To" na ten temat. Metoda 'DefaultErrorAttributes':' addErrorDetail' w jaki sposób mogę kontrolować komunikat 'Throwable error' przekazany do' ErrorAttributes'? – royB

+0

Jeśli wyjątek pochodzi z '@ PreAuthorize', nie możesz go kontrolować (lub przynajmniej nie rozumiem, dlaczego chcesz). Można, jak przypuszczam, dodać niestandardowy "AccessDecisionManager", ale to naprawdę nie jest główny nurt. –

+3

Hi @DaveSyer, Mam sytuację '@PreAuthorize (" isAuthenticated() i principal.user.isEnabled() == true i principal.user.isConfirmed() == true ")' i chcę się różnić, które z ograniczeń zgłasza wyjątek AccessDeniedException. Następnie obsłuż go i wyrzuć własny wyjątek w zależności od niezadowalającego stanu. Czy tylko to, co mogę zrobić, aby napisać własny aspekt i wyrzucić wyjątki przez siebie? – InsFi