2015-07-27 18 views
6

In Spring Security OAuth2 basierter Authentifizierung, wenn der Client einen Zugriffstoken, die aktualisiert werden muss sendet, wirft die DefaultTokenServices Klasse eine InvalidTokenException (siehe in Zeile 235):Frühling OAuth2 - benutzerdefinierte Exception-Handler

https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/main/java/org/springframework/security/oauth2/provider/token/DefaultTokenServices.java

Die Ausgabe, wenn dies geschieht, ist etwas wie:

{"error":"invalid_token","error_description":"Invalid access token: a0cb5ab9-7281-46bd-a9a2-796a04a906c9" 
} 

Ich möchte diesen Ausgang ändern, aber ich habe verloren. Eine andere Antwort schlug vor, eine benutzerdefinierte exceptionRenderer einzurichten, aber das hat auch nicht funktioniert, meine benutzerdefinierte Ausnahme-Renderer wird nie in diesen Fällen aufgerufen.

Auch gibt es eine so genannte Ausnahmeübersetzer, aber sie wurden entweder auf keinen Fall aufgerufen.

Teil meiner Feder config:

<bean id="clientAuthenticationEntryPoint" 
     class="org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint"> 
    <property name="typeName" value="Basic"/> 
    <property name="exceptionRenderer" ref="myExceptionRenderer" /> 
</bean> 


<bean id="oauthAuthenticationEntryPoint" 
     class="org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint"> 
     <property name="exceptionRenderer" ref="myExceptionRenderer" /> 
     <property name="exceptionTranslator" ref="listyOauthExceptionTranslator" /> 
</bean> 

<bean id="oauthAccessDeniedHandler" class="org.springframework.security.oauth2.provider.error.OAuth2AccessDeniedHandler" > 
<property name="exceptionRenderer" ref="myExceptionRenderer" /> 
<property name="exceptionTranslator" ref="myExceptionTranslator" /> 
</bean> 

<bean id="myExceptionRenderer" class="com.example.exceptions.MyOauth2ExceptionRenderer" /> 

<bean id="myExceptionTranslator" class="com.example.exceptions.MyOauth2ExceptionTranslator" /> 

Die Ausnahme-Renderer:

public class MyExceptionRenderer implements OAuth2ExceptionRenderer { 

@Override 
public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest) throws Exception { 
    System.out.println("Thrown exception"); 
} 

}

ich auch eine benutzerdefinierte Exception Mapper hinzugefügt, die alle Ausnahmen bekommen sollte, aber da ich nehmen Sie ein anderes Servlet an, das funktioniert in diesem Fall nicht wirklich?

@Provider 
public class GenericExceptionMapper implements ExceptionMapper<Throwable> { 

@Override 
public Response toResponse(Throwable ex) { 
    System.out.println("MAPPING EXCEPTION"); 
    return Response.status(200).entity().build(); 
} 
} 

ich Fälle von AuthenticationException fangen konnte, aber keine des InvalidTokenExceptions.

Irgendwelche Hilfe diesbezüglich? Wo fängt Spring tatsächlich diese InvalidTokenException ab und wie kann ich sie einrichten, damit ich eine benutzerdefinierte Ausgabe bereitstellen kann?

+0

Welche Version von Oauth2 verwenden Sie? '2.0.7' oder' 1. * '? – Karthik

+0

Ich verwende diese: – breakline

+0

4.0.5.RELEASE 3.2.4.RELEASE 2.0.3.RELEASE 1.0.2.RELEASE – breakline

Antwort

5

InvalidTokenException erweitert ClientAuthenticationException. So können Sie Ihre eigene Ausnahme erstellen, indem ClientAuthenticationException erstreckt und werfen diese statt InvalidTokenException

public class CustomException extends ClientAuthenticationException { 

    public CustomException(String msg, Throwable t) { 
     super(msg, t); 
    } 

    public CustomException(String msg) { 
     super(msg); 
    } 
    @Override 
    public String getOAuth2ErrorCode() { 
     return "my_custom_exception"; 
    } 
} 

wie

throw new CustomException("Invalid access token: " + accessTokenValue); 

In dem Fehler, der durch InvalidTokenException geworfen wird

{"error":"invalid_token","error_description":"Invalid access token: a0cb5ab9-7281-46bd-a9a2-796a04a906c9"} 

invalid_token zurückgegeben durch getOAuth2ErrorCode() Methode von InvalidTokenException und Invalid access token: a0cb5ab9-7281-46bd-a9a2-796a04a906c9 ist die Nachricht, die Sie geben, wenn Sie Th werfen die Ausnahme.

Wenn Sie

throw new CustomException("This is my custom exception"); 

der Fehler werfen würde gezeigt als

{"error":"my_custom_exception","error_description":"This is my custom exception"} 

my_custom_exception aus getOAuth2ErrorCode() von CustomException kommen.

+0

Ich kann keine benutzerdefinierte Ausnahme verwenden , da das Spring Security Servlet und mein Exception Mapper nie aufgerufen werden. Ich habe das auch gefunden, aber ich weiß nicht, wie man das via XML konfiguriert? – breakline

+0

https://github.com/spring-projects/spring-security-oauth/issues/375 – breakline

+0

@breakline was meinst du mit dir kann keine benutzerdefinierte Ausnahme verwenden? Werfen Sie diese benutzerdefinierte Ausnahme in Ihre 'DefaultTokenServices'. – Karthik

3

Die Antwort liefert keine benutzerdefinierte Implementierung, eine benutzerdefinierte Antwort ist ein Punkt im Code, wo ich auf die Standardantwort zugreifen kann und ich kann ein POJO anstelle davon senden, zum Beispiel wenn Sie error_description zu error_info oder ändern möchten alles andere oder Sie möchten der Antwort möglicherweise weitere Variablen hinzufügen. Die Lösung existiert, aber ich denke, es ist schmerzhaft zu implementieren, um es gelinde auszudrücken, wie ich es aus here kopieren:

Dieses Problem wurde behoben. Folgen Sie der folgenden Problemumgehung: 1 Erweitern Sie OAuth2Exception in eine neue Klasse, z. B. CustomOAuth2Exception. Fügen Sie in der benutzerdefinierten Klasse einige spezifische Eigenschaften hinzu. 2 benutzerdefinierte DefaultWebResponseExceptionTranslator und registrieren Sie den benutzerdefinierten Übersetzer in AuthorizationServerConfiguration. 3 benutzerdefinierte zwei Jacksons Serialisierer in OAuth2Exception kommentiert und Ihre CustomOAuth2Exception mit den zwei benutzerdefinierten Serialisierer kommentiert. 4 Verwenden Sie den ObjectMapper, um initiale Serializer mit benutzerdefinierten Serialisierern zu überschreiben.

Verwandte Themen