2013-08-11 12 views
5

Używam zabezpieczeń Spring 3.1 i Spring 3.2 dla usług REST. Staram się, aby każda odpowiedź była JSON np. jeśli użytkownik próbuje uzyskać dostęp do jakiegoś zasobu, ale nie jest jeszcze uwierzytelniony. Również jeśli użytkownik zło błędnego żądania, chcę zwrócić JSON z komunikatem o błędzie.Obsługa błędów zabezpieczeń sprężynowych z odpowiedzią JSON

Wystarczy wspomnieć, że byłoby bardziej akceptowalne posiadanie jakiegoś globalnego miejsca, w którym powinienem wychwycić wszystkie błędy/wyjątki.

+0

Obecnie próbuję dowiedzieć się tego wypróbuję jedną część z wiosennym zabezpieczeniem. Znajdź jakieś rozwiązanie jeszcze? Idealnie chcemy zdefiniować jeden obiekt błędu zdefiniowany w json, aby klient mógł go obsłużyć. – Michael

Odpowiedz

3

dlaczego nie napiszesz klasy kontrolera rozszerzonej przez wszystkie inne kontrolery (lub użyj @ControllerAdvice w przypadku, gdy używasz wersji 3.2) i dołączasz metodę opisaną w tej klasie? Coś takiego

@ExceptionHandler(Throwable.class) 
public @ResponseBody GenericResponse handleException(Throwable throwable){ 
//handle exception 

} 

lub czytać ten blog post

UPDATE

Niestety do tej późnej odpowiedzi. Oto moja sugestia. Zrób po prostu niepowodzenie z odpowiedzią 403. W tym celu dodaj poniższy fragment w konfiguracji zabezpieczeń wiosennych.

<beans:bean id="entryPoint" 
    class="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint" /> 

i punkt punkt_wejścia-ref do tej fasoli

<http auto-config="true" use-expressions="true" entry-point-ref="entryPoint"> 

aw stronie klienta w kodzie AJAX, dodać blok błędzie

  error : function(jqXHR, textStatus, errorThrown){ 
       if (jqXHR.status == 403){ 
        alert('you need to login to do this operation'); 
        window.location.href = contextPath+"/signin"; 
// or whatever you want to 
       } 
      } 
+3

nie rozwiązuje mojego problemu, nie przechwytuje złych żądań. Może ze względu na bezpieczeństwo wiosny. Nie można zaakceptować tej odpowiedzi jako prawidłowej. – Zemzela

+1

Jak wspomniał Zemzela, nie zajmuje się żadnym problemem związanym z bezpieczeństwem wiosennym, ponieważ zgłasza wyjątek lub błąd przed wywołaniem kontrolera. – Michael

+0

@Michael: Moja najgorsza, przegapiłem punkt, w którym uwierzytelnianie jest wykonywane przed wywołaniem serwletu dyspozytora. Zaktualizowałem swoją odpowiedź. Proszę podać swoje spostrzeżenia. – shazinltc