2

我有問題定義自定義錯誤消息時登錄失敗,所以現在當我登錄失敗,我得到HTTP 400與有效載荷:春天的oauth2自定義登錄錯誤

​​

如何自定義此消息,並返回自己的JSON?

我使用的是spring boot(1.3.2.RELEASE)和spring security OAuth2(2.0.8.RELEASE)。

回答

5

首先,創建一個新的異常,擴展Oauth2Exception。例如,我們有一個像CustomOauthException如下:

@JsonSerialize(using = CustomOauthExceptionSerializer.class) 
public class CustomOauthException extends OAuth2Exception { 
    public CustomOauthException(String msg) { 
     super(msg); 
    } 
} 

這裏我們要使用CustomOauthExceptionSerializer序列化CustomOauthException s到JSON字符串:

public class CustomOauthExceptionSerializer extends StdSerializer<CustomOauthException> { 
    public CustomOauthExceptionSerializer() { 
     super(CustomOauthException.class); 
    } 

    @Override 
    public void serialize(CustomOauthException value, JsonGenerator gen, SerializerProvider provider) throws IOException { 
     gen.writeStartObject(); 
     gen.writeStringField("custom_error", value.getOAuth2ErrorCode()); 
     gen.writeStringField("custom_error_description", value.getMessage()); 
     if (value.getAdditionalInformation()!=null) { 
      for (Map.Entry<String, String> entry : value.getAdditionalInformation().entrySet()) { 
       String key = entry.getKey(); 
       String add = entry.getValue(); 
       gen.writeStringField(key, add); 
      } 
     } 
     gen.writeEndObject(); 
    } 
} 

最後,我們需要在我們的AuthorizationServerConfigurerAdapter來註冊一個將spring security的Oauth2Exception s翻譯成我們的CustomOauthException s。在這裏,我們有:

@Configuration 
@EnableAuthorizationServer 
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { 
    @Override 
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { 
     endpoints 
       // other endpoints 
       .exceptionTranslator(e -> { 
        if (e instanceof OAuth2Exception) { 
         OAuth2Exception oAuth2Exception = (OAuth2Exception) e; 

         return ResponseEntity 
           .status(oAuth2Exception.getHttpErrorCode()) 
           .body(new CustomOauthException(oAuth2Exception.getMessage())); 
        } else { 
         throw e; 
        } 
       }); 
    } 

    // rest of the authorization server config 
} 

畢竟這些,你會看到自定義的JSON響應:

{"custom_error":"invalid_grant", "custom_error_description":"Bad credentials"} 
+1

就像一個魅力:) – luckybastard

+0

你知道該怎麼做的XML配置一樣嗎? – Jacek

+0

太棒了!它確實對我有用!它現在在拋出一些異常時返回自定義異常消息。 – JacobChan