2017-10-26 3 views
0

My Frühlings-Boot-OAuth REST-Anwendung gibt "401 Unauthorized" Status, wenn die Datenbank-Verbindungsfehler (Spring Security wirft InternalAuthenticationServiceException). Es ist seltsam, und ich brauche Status zu ändern, um „500 Interner Serverfehler“, dass der Client kann eine angemessene Beschreibung liefern, wie „Dienst nicht verfügbar ist“.Frühling Boot Security OAuth - Griff InternalAuthenticationServiceException

Wenn ich WebResponseExceptionTranslator dann kann ich Antwort fangen, aber wenn ich HTTP-Status ändern, es funktioniert nur, wenn die Datenbank aktiv. Wenn die Datenbank heruntergefahren wird, bekomme ich wieder "401 Unauthorized".

Wie kann ich dieses Problem gnädigst lösen?

Antwort

0

abhängig davon, welche Ebene die Ausnahme ausgelöst wird, möchten Sie vielleicht Exception-Handler zu Ihrem Login-Controller hinzuzufügen:

@ExceptionHandler(InternalAuthenticationServiceException.class) 
public ModelAndView handleError(HttpServletRequest req, Exception ex) { 
    // convert exception to 500, add logging and 
} 

mehr über Ausnahme erfahren Umgang hier: https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc

+0

Vielen Dank für Ihre Antwort. Ich bin mir nicht sicher, dass @ExceptionHandler der richtige Weg ist. Leider habe ich nicht LoginController, und alle Berechtigungsanforderungen verarbeitet durch feder oauth-Bibliothek. – TechnoPriest

0

ich dieses Problem beheben durch Hinzufügen "Versuchen Sie, fangen" um jdbcTemplate Anfrage in meinem benutzerdefinierten UserDetailService.

protected List<UserDetails> loadUsersByUsername(String username) { 

     try {  

      userDetailsList = this.getJdbcTemplate().query(USERS_BY_USERNAME, new String[]{username}, 
        new RowMapper() { 
         public UserDetails mapRow(ResultSet rs, int rowNum) throws SQLException { 
         String username = rs.getString(1); 

         /* etc. map user fields */ 

         return new SecurityUser(username, /* other params... */); 
        } 
      }); 

     } catch (CannotGetJdbcConnectionException e){ 

      logger.error("UserDetailService SQL error: " + e.getMessage(), e); 
     } 

     return userDetailsList; 
} 

Und dann prüfe ich InternalAuthenticationServiceException durch WebResponseExceptionTranslator und Antwortstatus ändern.

Es scheint, dass, wenn ich CannotGetJdbcConnectionException fangen dann in der Kette etwas ruiniert. Es funktioniert, aber ich werde meine Frage offen lassen, vielleicht kann jemand eine klarere Lösung anbieten.

Verwandte Themen