2015-07-27 15 views
6

In autenticazione basata Primavera di sicurezza OAuth2 quando il client invia un token di accesso che deve essere aggiornata, la classe DefaultTokenServices genera InvalidTokenException (vedi alla linea 235):Primavera OAuth2 - personalizzato gestore di eccezioni

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

l'uscita quando questo accade è qualcosa di simile:

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

vorrei cambiare questa uscita, ma mi sono perso. Qualche altra risposta suggeriva di creare un'eccezione exceptionRenderer ma questo non ha funzionato, il mio renderizzatore di eccezioni personalizzato non viene mai chiamato in questi casi.

Inoltre c'è qualcosa chiamato traduttore di eccezione ma non sono stati chiamati in alcun caso.

Parte del mio config primavera:

<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" /> 

Il renderer eccezione:

public class MyExceptionRenderer implements OAuth2ExceptionRenderer { 

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

}

Ho anche aggiunto un Mapper eccezione personalizzata che dovrebbe ottenere tutte le eccezioni, ma dal momento che supponiamo che sia un altro servlet che non funziona davvero in questo caso?

@Provider 
public class GenericExceptionMapper implements ExceptionMapper<Throwable> { 

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

ho potuto prendere i casi di AuthenticationException, ma non uno qualsiasi dei InvalidTokenExceptions.

Qualsiasi aiuto in merito? Da dove viene effettivamente Spring a prendere questo InvalidTokenException e come posso configurarlo in modo da poter fornire un output personalizzato?

+0

Quale versione di Oauth2 stai utilizzando? '2.0.7' o' 1. * '? – Karthik

+0

Sto usando questi: – breakline

+0

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

risposta

5

InvalidTokenException estende ClientAuthenticationException. Così si può creare il proprio eccezione estendendo ClientAuthenticationException e lanciare questo invece di 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"; 
    } 
} 

come

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

Nella errore che viene generato dal InvalidTokenException

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

invalid_token viene restituito da Il metodo getOAuth2ErrorCode() di InvalidTokenException e Invalid access token: a0cb5ab9-7281-46bd-a9a2-796a04a906c9 è il messaggio che dai quando ti lanci e eccezione.

Se gettate

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

l'errore sarebbe stato mostrato come

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

my_custom_exception proviene da getOAuth2ErrorCode() di CustomException.

+0

Non riesco a utilizzare un'eccezione personalizzata , dal momento che il servo di sicurezza Spring e il mio mapping delle eccezioni non viene mai chiamato. Ho trovato anche questo, ma non so come configurare questo tramite xml? – breakline

+0

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

+0

@breakline cosa intendi per non poter utilizzare un'eccezione personalizzata? Getta questa eccezione personalizzata nei tuoi "DefaultTokenServices". – Karthik

3

La risposta in realtà non fornire un'implementazione personalizzata, una risposta personalizzata sarà un punto nel codice in cui posso accedere alla risposta predefinita e posso inviare un POJO invece di esso, ad esempio se si desidera modificare error_description-error_info o qualsiasi altra cosa, o potresti voler aggiungere più variabili alla risposta. La soluzione esiste, ma penso che sia doloroso implementare a dir poco, mentre lo copio da here:

Questo problema è stato risolto. Seguire la soluzione qui sotto: 1 estendere OAuth2Exception a una nuova classe, ad esempio CustomOAuth2Exception. Nella classe personalizzata, aggiungi alcune proprietà specifiche. 2 personalizzato DefaultWebResponseExceptionTranslator e registra il traduttore personalizzato in AuthorizationServerConfiguration. 3 serializzatori personalizzati a due jackson annotati in OAuth2Exception e annotati CustomOAuth2Exception con i due serializzatori personalizzati. 4 utilizzare ObjectMapper per sovrascrivere i serializzatori iniziali con serializzatori personalizzati.